Heim > Backend-Entwicklung > Golang > 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?

Mary-Kate Olsen
Freigeben: 2024-10-29 07:20:30
Original
215 Leute haben es durchsucht

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

Wählen Sie einen Go-Kanal zum gleichzeitigen Senden und Empfangen aus

In Go ist es möglich, nicht blockierende E/A-Operationen auf Kanälen mithilfe der Select-Anweisung durchzuführen. Beim Umgang mit einem gepufferten Sendekanal (chan<-) und einem ungepufferten Empfangskanal (<-chan) stellt sich jedoch häufig die Frage: Wie kann man auf beiden Kanälen gleichzeitig auswählen und dabei dem Empfangskanal Vorrang einräumen, wenn er Daten hat, und dem Sendekanal? Kanal, ob er Kapazität hat?

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 Status des Kanals zwischen der Überprüfung und dem nachfolgenden Vorgang ändern kann:

<code class="go">if len(r) > 0 {
    // Optionally execute other code

    r <- v  // May block if another goroutine received from r in the meantime
}</p>
<h3>Die Lösung: Standardfall mit Zeitverzögerung</h3>
<p>Um dieses Problem zu beheben, können Sie Folgendes tun Verwenden Sie eine Select-Anweisung mit einem Standardfall, 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:</p>
<pre class="brush:php;toolbar:false"><code class="go">s := make(chan<- int, 5)
r := make(<-chan int)

for {
    v := valueToSend()
    select {
    case s <- v:
        fmt.Println("Sent value:", v)
    case vr := <-r:
        fmt.Println("Received:", vr)
    default: // If none are ready, delay execution
        time.Sleep(time.Millisecond * 1)
    }
}</code>
Nach dem Login kopieren

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

Das obige ist der detaillierte Inhalt vonWie wähle ich in Go gleichzeitig einen gepufferten Sende- und einen ungepufferten Empfangskanal aus?. 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