Sobes.tech
Junior — Middle

Como parar corretamente uma goroutine em execução, se necessário que ela termine com base em um sinal externo ou condição, mesmo que o resultado ainda não tenha sido obtido?

sobes.tech IA

Resposta da IA

Para parar corretamente uma goroutine em execução por um sinal externo ou condição em Go, geralmente usa-se o contexto (context.Context) ou canais para transmitir o sinal de cancelamento.

Exemplo usando contexto:

func worker(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            // Sinal de cancelamento recebido, encerrando a goroutine
            return
        default:
            // Executar trabalho
        }
    }
}

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    go worker(ctx)

    // Em algum momento, chamamos cancel() para parar a goroutine
    cancel()
}

Essa abordagem permite que a goroutine verifique periodicamente se um sinal de parada foi enviado e finalize corretamente, mesmo que o resultado ainda não tenha sido obtido. De forma semelhante, pode-se usar um canal para transmitir o sinal de parada, mas o context é uma maneira mais idiomática e conveniente em Go.