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?
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>
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!