Wie kann ich aus einer Select-Anweisung ausbrechen, wenn in Go alle Kanäle geschlossen sind?

Linda Hamilton
Freigeben: 2024-11-13 16:47:02
Original
197 Leute haben es durchsucht

How to Break Out of a Select Statement When All Channels Are Closed in Go?

Aus einer Select-Anweisung ausbrechen, wenn alle Kanäle geschlossen sind

Stellen Sie sich ein Szenario vor, in dem mehrere Goroutinen Daten an einzelne Kanäle senden, und zwar auf Wunsch um diese Daten in beliebiger Reihenfolge zu verbrauchen. Die Verwendung einer Select-Anweisung bietet eine bequeme Möglichkeit, gleichzeitige Eingaben aus mehreren Quellen zu verarbeiten. Die Herausforderung entsteht jedoch, wenn Sie den Kreislauf erst verlassen müssen, wenn alle Kanäle geschlossen sind.

Naive Lösung

Ein intuitiver Ansatz könnte darin bestehen, die Verfügbarkeit jedes Kanals zu überprüfen durch Verwendung der ok-Flagge. Allerdings ist diese Lösung fehleranfällig, da ein geschlossener Kanal bei Auswahl wieder verfügbar wird. Dies führt zu einer Endlosschleife, wie in diesem Spielplatzbeispiel gezeigt: http://play.golang.org/p/rOjdvnji49.

Verbesserte Lösung

Ein weiteres Ein effektiver Ansatz besteht darin, die Tatsache auszunutzen, dass ein Nullkanal niemals für die Kommunikation bereit ist. Jedes Mal, wenn ein Kanal geschlossen wird, kann er auf Null gesetzt werden, um sicherzustellen, dass er von zukünftigen Select-Anweisungen ausgeschlossen wird. Dadurch wird garantiert, dass die Schleife erst endet, wenn alle Kanäle geschlossen sind:

for {
    select {
    case x, ok := <-ch:
        fmt.Println("ch1", x, ok)
        if !ok {
            ch = nil
        }
    case x, ok := <-ch2:
        fmt.Println("ch2", x, ok)
        if !ok {
            ch2 = nil
        }
    }

    if ch == nil &amp;&amp; ch2 == nil {
        break
    }
}
Nach dem Login kopieren

Spielplatzbeispiel: http://play.golang.org/p/8lkV_Hffyj

Praktische Überlegungen

In der Praxis ist es unwahrscheinlich, dass Sie eine große Anzahl von Kanälen in einer einzigen Select-Anweisung verarbeiten müssen. Wenn ein solches Szenario auftritt, ist es ratsam, eine speziellere Lösung zu verwenden, beispielsweise einen Kanalmultiplexer, um den Code nicht mit übermäßigen Nullprüfungen zu überladen.

Das obige ist der detaillierte Inhalt vonWie kann ich aus einer Select-Anweisung ausbrechen, wenn in Go alle Kanäle geschlossen sind?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage