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.
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