Je suis coincé dans une situation étrange où l'opération d'écriture sur le canal n'arrive jamais.Ecrivez au canal bloqué pour toujours
package main
import (
"fmt"
"time"
)
func main() {
c := make(chan int)
s := make(chan bool)
k := make(chan bool)
fmt.Println("start")
go func() {
fmt.Println("routine 1")
s <- true
}()
go func() {
fmt.Println("routine 2")
for {
select {
case <-s :
for i := 0; i < 3; i++ {
fmt.Println("before")
c <- i
fmt.Println("after")
}
case <- k :
fmt.Println("k ready")
break
}
}
}()
go func() {
fmt.Println("routine 3")
for {
select {
case x := <- c :
fmt.Println("x=", x)
k <- true
fmt.Println("k done")
}
}
}()
time.Sleep(1000 * time.Millisecond)
}
Et voici la sortie:
start
routine 1
routine 2
before
routine 3
x= 0
after
before
Je me demande pourquoi l'écriture aux canaux k blocs, mais la déclaration de journal fmt.Println("k ready")
est jamais imprimé.
Voici ce que je pense:
- go routine 1 écrit vrai canal de
- go routine 2 écrit 0 à canal c et attend parce que la taille de la mémoire tampon est 0, il ne sera pas en mesure de écrivez '1' à moins que quelqu'un lit le canal c
- va routine 3 entre dans l'image, lit le canal c (maintenant aller la routine 2 peut écrire à c une fois aller routine 2 CV) imprime la valeur de x. MAINTENANT IL pouvoir écrire sur le canal K, mais cela ne se produit
Selon moi, il devrait être en mesure d'écrire à canal k alors le cas 2 de goroutine doit exécuter et imprimer « k prêt »
Quelqu'un peut-il m'expliquer pourquoi écrire à la chaîne bloquée? Comme une solution, je sais que je peux augmenter la taille de la mémoire tampon du canal c et tout sera imprimé, mais je ne suis pas intéressé par la réparation, à la place, je veux comprendre ce scénario. Un bon blog pour comprendre le cas ci-dessus.
Lien vers le code ci-dessus est [ici] (https://play.golang.org/p/3YL2eoTVn1) –