"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 você pode obter leitura simultânea de vários canais em Golang?

Como você pode obter leitura simultânea de vários canais em Golang?

Publicado em 2024-11-24
Navegar:676

How Can You Achieve Concurrent Reading from Multiple Channels in Golang?

Leitura de vários canais simultaneamente em Golang

Em Golang, é possível criar um canal "any-to-one", onde vários goroutines podem gravar no mesmo canal simultaneamente. Vamos explorar como obter essa funcionalidade.

Uma abordagem é usar uma instrução select, que permite esperar que vários canais recebam dados:

func main() {
  // Create input channels
  c1 := make(chan int)
  c2 := make(chan int)
  // Create output channel
  out := make(chan int)

  // Start a goroutine that reads from both input channels and sums the received values
  go func(in1, in2 <-chan int, out chan<- int) {
    for {
      sum := 0
      select {
      case sum = <-in1:
        sum  = <-in2
      case sum = <-in2:
        sum  = <-in1
      }
      out <- sum
    }
  }(c1, c2, out)
}

Esta goroutine é executada indefinidamente, lendo ambos os canais e enviando a soma dos valores recebidos para o canal de saída. Para encerrar a goroutine, é necessário fechar ambos os canais de entrada.

Como uma abordagem alternativa, você pode usar o seguinte código:

func addnum(num1, num2, sum chan int) {
  done := make(chan bool)

  go func() {
    n1 := <-num1
    done <- true        // Signal completion of one channel read
  }()

  n2 := <-num2             // Read from the other channel
  <-done                   // Wait for the first read to complete

  sum <- n1   n2
}

Esta função usa um canal "concluído" separado para notificar quando um canal foi lido com sucesso. No entanto, esta abordagem pode ser menos flexível, pois requer a modificação das goroutines que gravam nos canais de entrada.

A abordagem apropriada depende dos requisitos específicos da sua aplicação. Não importa o método escolhido, os recursos de simultaneidade do Golang fornecem ferramentas poderosas para lidar com vários canais simultaneamente.

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