Go-Kanäle und Deadlocks
In Go werden Kanäle zur Kommunikation zwischen Goroutinen verwendet. Wenn Kanäle jedoch nicht ordnungsgemäß verarbeitet werden, kann es zu Deadlocks kommen.
Beachten Sie den folgenden Code:
<code class="go">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) }</code>
Dieser Code gibt Zahlen auf unbestimmte Zeit aus, bis die Hauptfunktion beendet wird. Wenn wir jedoch von der Hauptfunktion aus einen anderen Wert an einen der Kanäle senden, blockiert das Programm Folgendes:
<code class="go">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) }</code>
Dies geschieht, weil die zweite Goroutine niemals den an c1 gesendeten Wert „2“ empfängt. Der Grund für diesen Deadlock ist, dass die beiden Goroutinen darauf warten, dass einander Werte sendet und empfängt, wodurch eine zirkuläre Abhängigkeit entsteht.
Deadlocks debuggen
Um Deadlocks zu debuggen, Es können mehrere Ansätze verwendet werden:
Das obige ist der detaillierte Inhalt vonWie können Deadlocks in Go-Kanälen auftreten und wie kann man sie debuggen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!