„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie wähle ich in Go gleichzeitig einen gepufferten Sende- und einen ungepufferten Empfangskanal aus?

Wie wähle ich in Go gleichzeitig einen gepufferten Sende- und einen ungepufferten Empfangskanal aus?

Veröffentlicht am 06.11.2024
Durchsuche:191

How to Select on a Buffered Send and Unbuffered Receive Channel Simultaneously in Go?

Wählen Sie auf einem Go einen Kanal aus, der ihn gleichzeitig sendet und empfängt.

In Go ist es möglich, nicht blockierende E/A-Operationen auf Kanälen mithilfe der Select-Anweisung auszuführen. Beim Umgang mit einem gepufferten Sendekanal (chan

Das Problem bei der Überprüfung der Kanallänge/-kapazität

Ein gängiger Ansatz besteht darin, die Länge oder Kapazität der Kanäle vor dem Senden oder Empfangen zu überprüfen. Dies ist jedoch nicht zuverlässig, da sich der Zustand des Kanals zwischen der Prüfung und der nachfolgenden Operation ändern kann:

if len(r) > 0 {
    // Optionally execute other code

    r 

Die Lösung: Standardfall mit Zeitverzögerung

Um dieses Problem zu beheben, können Sie eine Select-Anweisung mit einem Standardfall verwenden, der eine kurze Zeitverzögerung beinhaltet. Dies verhindert eine übermäßige CPU-Auslastung und ermöglicht Ihnen gleichzeitig, den Vorgang erneut zu versuchen, wenn beide Kanäle nicht bereit sind:

s := make(chan

Durch Hinzufügen des Standardfalls blockiert das Programm nur für kurze Zeit, wenn beide Kanäle nicht bereit sind, sodass die CPU-Ressourcen freigegeben werden können, während es darauf wartet, dass ein Kanal verfügbar wird.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3