Lecture simultanée à partir de plusieurs canaux dans Golang
Dans Golang, il est possible de créer un canal « n'importe lequel à un », où plusieurs goroutines peuvent écrire simultanément sur le même canal. Voyons comment obtenir cette fonctionnalité.
Une approche consiste à utiliser une instruction select, qui vous permet d'attendre que plusieurs canaux reçoivent des données :
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)
}
Cette goroutine s'exécute indéfiniment, lisant les deux canaux et envoyant la somme des valeurs reçues au canal de sortie. Pour terminer la goroutine, il est inutile de fermer les deux canaux d'entrée.
Comme approche alternative, vous pouvez utiliser le code suivant :
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
}
Cette fonction utilise un canal "terminé" distinct pour avertir lorsqu'un canal a été lu avec succès. Cependant, cette approche peut être moins flexible, car elle nécessite de modifier les goroutines qui écrivent sur les canaux d'entrée.
L'approche appropriée dépend des exigences spécifiques de votre application. Quelle que soit la méthode que vous choisissez, les fonctionnalités de concurrence de Golang fournissent des outils puissants pour gérer plusieurs canaux simultanément.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3