Heim >Backend-Entwicklung >Golang >Warum führen verkettete Kanaloperationen in Gos „select'-Anweisung zu einem Deadlock?

Warum führen verkettete Kanaloperationen in Gos „select'-Anweisung zu einem Deadlock?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-22 05:37:22663Durchsuche

Why Do Chained Channel Operations in Go's `select` Statement Lead to Deadlock?

Verkettete Kanaloperationen in einem ausgewählten Fall: Deadlock verstehen

In Go fasst die fanIn-Funktion Werte aus mehreren Eingabekanälen in einer einzigen Ausgabe zusammen Kanal, der eine Form des Multiplexens bietet. Die select-Anweisung in der fanIn-Funktion verwendet nicht blockierende <- Operationen, um gleichzeitig aus mehreren Eingabekanälen zu lesen.

Wenn die select-Anweisung jedoch so geändert wird, dass sie verkettete Kanaloperationen enthält, wie zum Beispiel:

select {
    case ch <- <-input1:
    case ch <- <-input2:
}

Es kann zu seltsamem Verhalten kommen. Einige Werte können gelöscht werden, was zu einem Deadlock führt.

Um zu verstehen, warum dies geschieht, ist es wichtig, sich daran zu erinnern, dass in einer SELECT-Anweisung nur ein Lese- oder Schreibvorgang für einen Kanal nicht blockierend ist. Andere verhalten sich so, als ob der Blockoperator verwendet würde.

In der modifizierten fanIn-Funktion liest der erste Fall einen Wert von Eingang1 und versucht, ihn auf nicht blockierende Weise in ch zu schreiben. Dies kann gelingen, wenn die Hauptfunktion den Wert zeitnah verbraucht. Es besteht jedoch eine geringe Wahrscheinlichkeit, dass die Hauptfunktionsschleife dafür nicht schnell genug ist.

In den nachfolgenden Iterationen der fanIn-Schleife wird wahrscheinlich der zweite Fall ausgewählt, und zu diesem Zeitpunkt ist der Die zweite Goroutine hat möglicherweise einen Wert in ch geschrieben. Wenn die Hauptfunktion jedoch den Wert aus der vorherigen Iteration noch nicht verbraucht hat, wird er gelöscht.

Dieser Zyklus des Löschens von Werten führt schließlich dazu, dass es keine Autoren mehr gibt, dafür aber einen Leser Warte immer noch auf Werte, was zu einem Deadlock führt.

Eine modifizierte Version des Codes zeigt dieses Problem deutlicher: https://play.golang.org/p/lcM5OKx09Dj

Das obige ist der detaillierte Inhalt vonWarum führen verkettete Kanaloperationen in Gos „select'-Anweisung zu einem Deadlock?. 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