Apagado ordenado en Go
Un canal done, cerrado una sola vez, le avisa a cada worker que pare.
func workUntilDone(jobs <-chan int, done <-chan struct{}) []int {
var (
mu sync.Mutex
handled []int
wg sync.WaitGroup
)
for range 3 {
wg.Go(func() {
for {
select {
case job, ok := <-jobs:
if !ok {
return
}
mu.Lock()
handled = append(handled, job)
mu.Unlock()
case <-done:
return
}
}
})
}
wg.Wait()
return handled
}
Cómo funciona
- Cerrar un canal transmite a todos: cada receptor despierta.
- Los workers hacen select entre su trabajo y done.
- Espéralos antes de retornar, o fugas goroutines.
Palabras clave y builtins usados aquí
appendcasechanforfuncifintrangereturnselectstructvar
El intento, en números
- Líneas
- 28
- Caracteres a escribir
- 326
- Tokens
- 100
- Ritmo de tres estrellas
- 110 tpm
Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 55 segundos.
Paso 5 de 5 en Patrones; paso 23 de 25 en Concurrencia.