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

Patricia Arquette
Freigeben: 2024-10-27 05:34:03
Original
922 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!