"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como evitar o impasse ao percorrer um canal com buffer no GoLang?

Como evitar o impasse ao percorrer um canal com buffer no GoLang?

Publicado em 2024-11-02
Navegar:267

How to Avoid Deadlock When Ranging Over a Buffered Channel in GoLang?

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:

  • O tamanho do canal é muito pequeno, resultando em goroutines bloqueadas aguardando para gravar no canal completo.
  • O intervalo de operação no canal permanece indefinidamente aguardando a chegada dos elementos, enquanto não há mais goroutines para escrever.

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.

Tutorial mais recente Mais>

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