"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 deadlock na simultaneidade Go com sync.WaitGroup?

Como evitar deadlock na simultaneidade Go com sync.WaitGroup?

Publicado em 2024-11-02
Navegar:145

How to Prevent Deadlock in Go Concurrency with sync.WaitGroup?

Resolvendo impasse de Goroutines

Neste cenário, você encontrou um erro de impasse em seu código de simultaneidade Go. Vamos nos aprofundar no assunto e apresentar uma solução eficiente.

O erro ocorre devido ao descompasso entre o comportamento de seus produtores e do consumidor. Seus produtores, implementados na função de produtor, estão enviando valores no canal ch por um período limitado. Porém, o consumidor, presente em sua função principal, corre indefinidamente, tentando incessantemente receber valores do ch.

Para resolver esse impasse, é preciso garantir que o consumidor respeite o preenchimento dos produtores. Isso significa que o consumidor deve encerrar automaticamente quando os produtores terminarem de enviar os valores.

Uma abordagem eficaz é utilizar um sync.WaitGroup para coordenar os produtores. O grupo de espera permite acompanhar o andamento dos produtores e esperar que eles concluam suas tarefas antes de fechar o canal. Aqui está uma versão melhorada do seu código:

func main() {
    var wg sync.WaitGroup
    ch := make(chan int)

    wg.Add(1)
    go producer(ch, 100*time.Millisecond, 2, &wg)

    wg.Add(1)
    go producer(ch, 200*time.Millisecond, 5, &wg)

    // Start a goroutine to close the channel when all producers are done
    go func() {
        wg.Wait()
        close(ch)
    }()

    // Use a for range loop to receive values from the channel
    for v := range ch {
        fmt.Println(v)
    }
}

Neste código atualizado, o sync.WaitGroup é usado para controlar o número de produtores ativos. Os produtores chamam wg.Done() para diminuir o grupo de espera quando terminam de enviar valores. A goroutine principal espera que todos os produtores terminem usando wg.Wait() e, em seguida, fecha o canal ch.

Ao utilizar um sync.WaitGroup, você estabelece um mecanismo de coordenação que permite ao seu consumidor respeitar o status de conclusão dos produtores, resolvendo efetivamente o erro de impasse.

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