"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 > Padrão Fanin em Go

Padrão Fanin em Go

Publicado em 2024-08-24
Navegar:552

Fanin Pattern in Go

Vamos dar uma olhada no padrão de fan-in. Isso é realmente útil quando temos dados relacionados de vários threads que precisamos reunir.

Por exemplo, suponha que você tenha feito várias chamadas de API para serviços diferentes e precise combinar os resultados.

Este é um padrão muito fácil de implementar, mas você precisa prestar atenção em como você lida com os canais. É fácil obter uma condição de impasse.

// produce is used to simulate the different data sources
func produce(id int) chan int {
    ch := make(chan int)
    go func() {
        for i := 0; i 



Aqui usamos a função de produção para simular as diferentes fontes. Esses canais de origem são enviados para a função fanin que realiza a operação de combinação.

A função fanin cria o canal de saída e, em seguida, lança uma goroutine que opera em cada entrada. Usamos um WaitGroup para indicar quando todas as fontes de entrada foram combinadas no canal de saída.

Neste exemplo simples, o thread principal apenas itera sobre a saída. Observe que não há garantia no pedido, os valores das 2 entradas são misturados.

Um ponto importante a ser mencionado é que temos que fechar o canal de saída quando terminarmos de combinar as entradas. O operador de intervalo aguardará indefinidamente quando o canal estiver vazio. Comente a linha close(output) e você verá que obtém uma condição de deadlock.

Como podemos melhorar isso? Deixe-me um comentário abaixo.

Obrigado!

O código desta postagem e de todas as postagens desta série podem ser encontrados aqui

Declaração de lançamento Este artigo é reproduzido em: https://dev.to/johnscode/fanin-pattern-in-go-5e5d?1 Se houver alguma violação, entre em contato com [email protected] para excluí-lo.
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