Heim >Backend-Entwicklung >Golang >Wie können Deadlocks in Go-Kanälen auftreten und wie kann man sie debuggen?

Wie können Deadlocks in Go-Kanälen auftreten und wie kann man sie debuggen?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-30 15:16:02739Durchsuche

How Can Deadlocks Occur in Go Channels and How to Debug Them?

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:

  • Unix-ähnliches Betriebssystem: Verwenden Sie den Befehl kill -6 [pid], um das Programm zu beenden und einen Stack-Trace für jede Goroutine zu drucken.
  • gdb: Hängen Sie gdb an den Prozess an und untersuchen Sie den Stapel und die Variablen der aktiven Goroutine.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn