Deadlock no GoLang: Por que abranger um canal com buffer?
Ao usar canais com buffer no GoLang, é importante evitar a criação de uma situação de deadlock . Um problema recente levantou preocupações sobre um impasse encontrado ao tentar abranger um canal em buffer após a conclusão de todas as goroutines.
O código fornecido tenta usar um canal em buffer com capacidade de 4 e gerar 4 goroutines que enviam dados para o canal. No entanto, o impasse ocorre porque:
Solução 1: Expanda o tamanho do canal e feche após a conclusão
Para resolver o impasse, o canal pode ser aumentado em tamanho e fechado depois que todas as goroutines forem concluídas:
ch := make(chan []int, 5)
...
wg.Wait()
close(ch)
No entanto, isso elimina os benefícios do pipelining, pois evita a impressão até que todas as tarefas sejam concluídas.
Solução 2: Conclusão do sinal de dentro da rotina de impressão
Para ativar o pipeline real, a função Done() pode ser chamada dentro da rotina de impressão:
func main() {
ch := make(chan []int, 4)
...
go func() {
for c := range ch {
fmt.Printf("c is %v\n", c)
wg.Done()
}
}()
...
}
Essa abordagem garante que a função Done() seja chamada somente após cada elemento ter sido impresso, sinalizando efetivamente a conclusão de cada goroutine.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3