Heim > Artikel > Backend-Entwicklung > Wie erreicht man eine asynchrone Kommunikation mit Kanalbereitschaft in Go und minimiert gleichzeitig die CPU-Auslastung?
Asynchrone Kommunikation mit Kanalbereitschaft
In Go erleichtern Kanäle die gleichzeitige Kommunikation zwischen Goroutinen. Beim Umgang mit gepufferten Sendekanälen und ungepufferten Empfangskanälen ist es möglich, beide Kanäle gleichzeitig auszuwählen, um den Kommunikationsfluss zu optimieren. In diesem Artikel wird der Ansatz zur Implementierung dieser Funktionalität bei gleichzeitiger Minimierung der CPU-Auslastung untersucht.
Um das Problem zu verstehen, betrachten Sie den folgenden Kontext:
<code class="go">s := make(chan<- int, 5) // Buffered send channel r := make(<-chan int) // Unbuffered receive channel</code>
Es stellt sich die Frage, ob es möglich ist, auf beiden auszuwählen Kanäle, sodass r ausgewählt wird, wenn Daten zum Lesen verfügbar sind, und s ausgewählt wird, wenn der Kanal nicht voll ist.
Lösung
Dies kann mit einer Auswahl erreicht werden Anweisung mit einem Standardfall. Da der zu sendende Wert bei Verwendung von select nur einmal ausgewertet wird, ist der Wert veraltet, wenn beide Kanäle nicht bereit sind. Um dies zu vermeiden, wird der Auswahlanweisung ein Standardfall hinzugefügt, der ausgeführt wird, wenn keiner der Kanäle bereit ist. In diesem Standardfall schläft das Programm für kurze Zeit, damit die Kanäle bereit werden, und versucht es dann erneut mit einem aktualisierten Wert.
<code class="go">s := make(chan<- int, 5) r := make(<-chan int) for { v := valueToSend() // Evaluated each time we try to send select { case s <- v: fmt.Println("Sent value:", v) case vr := <-r: fmt.Println("Received:", vr) default: // If none are ready currently, we end up here time.Sleep(time.Millisecond * 1) } }</code>
Warnung
Die Verwendung von len(r) oder cap(s) zum Überprüfen der Kanalbereitschaft und anschließendes Senden/Empfangen wird nicht empfohlen, da der Kanal zwischen der Überprüfung und dem Sende-/Empfangsversuch seinen Status ändern kann.
Das obige ist der detaillierte Inhalt vonWie erreicht man eine asynchrone Kommunikation mit Kanalbereitschaft in Go und minimiert gleichzeitig die CPU-Auslastung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!