Heim >Backend-Entwicklung >Golang >Wie erreicht man eine asynchrone Kommunikation mit Kanalbereitschaft in Go und minimiert gleichzeitig die CPU-Auslastung?

Wie erreicht man eine asynchrone Kommunikation mit Kanalbereitschaft in Go und minimiert gleichzeitig die CPU-Auslastung?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-27 05:34:031031Durchsuche

How to Achieve Asynchronous Communication with Channel Readiness in Go While Minimizing CPU Utilization?

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!

Stellungnahme:
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