Sobes.tech
Junior — Middle

Como pode forçar a paragem de várias goroutines a correr em Go?

sobes.tech IA

Resposta da IA

Em Go, para parar várias goroutines em execução de forma forçada, geralmente usa-se o mecanismo de cancelamento através do contexto (context.Context).

Ideia principal:

  • Criar um contexto com cancelamento (context.WithCancel ou context.WithTimeout).
  • Cada goroutine recebe esse contexto e verifica periodicamente se foi cancelado.
  • Ao chamar a função de cancelamento (cancel()), todas as goroutines recebem o sinal e podem terminar corretamente.

Exemplo:

ctx, cancel := context.WithCancel(context.Background())

for i := 0; i < 5; i++ {
    go func(id int) {
        for {
            select {
            case <-ctx.Done():
                fmt.Printf("Goroutine %d parada\n", id)
                return
            default:
                // trabalho da goroutine
                time.Sleep(100 * time.Millisecond)
            }
        }
    }(i)
}

// Após algum tempo, paramos todas as goroutines
time.Sleep(1 * time.Second)
cancel()

// Esperamos que terminem (por exemplo, usando sync.WaitGroup)

Este método permite gerir centralizadamente a paragem de várias goroutines e evita problemas com encerramentos descontrolados.