typestar

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

  1. Cerrar un canal transmite a todos: cada receptor despierta.
  2. Los workers hacen select entre su trabajo y done.
  3. Espéralos antes de retornar, o fugas goroutines.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 5 de 5 en Patrones; paso 23 de 25 en Concurrencia.

← Anterior Siguiente →