Gehen Kanäle und deadlock

Ich versuche zu verstehen, Gehen Sprache. Ich habe versucht, zwei goroutines
Kette, die zwischen Ihnen fließen über zwei Kanäle:

func main() {
c1 := make(chan int)
c2 := make(chan int)

go func() {
    for i := range c1{
        println("G1 got", i)
        c2 <- i
    }
}()

go func() {
    for i := range c2 {
        println("G2 got", i)
        c1 <- i
    }
}()


c1 <- 1

time.Sleep(1000000000 * 50)
}

Als erwartet, dass dieser code druckt:

 G1 got 1
 G2 got 1
 G1 got 1
 G2 got 1
 ....

Bis die main-Funktion beendet.

Aber wenn ich senden einen anderen Wert, um einen der Kanäle aus Haupt -, plötzlich blockiert:

func main() {
c1 := make(chan int)
c2 := make(chan int)

go func() {
    for i := range c1{
        println("G1 got", i)
        c2 <- i
    }
}()

go func() {
    for i := range c2 {
        println("G2 got", i)
        c1 <- i
    }
}()


c1 <- 1

time.Sleep(1000000000 * 1)

c1 <- 2

time.Sleep(1000000000 * 50)
}

Gibt es

G1 got 1
G2 got 1
G1 got 1
G2 got 1
G1 got 2

und dann blockiert, bis der main endet.

Den Wert "2" an c1 kommt auf den ersten goroutie, die sendet auf c2, aber der zweite
goroutine nie erhält.

(Mit gepufferten Kanälen mit Größe 1 (entweder c1 oder c2) arbeitet in diesem Beispiel)

Warum ist es passiert? Wenn dies geschieht in realen code, wie kann ich Debuggen?

InformationsquelleAutor ithkuil | 2011-05-12
Schreibe einen Kommentar