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:
s := make(chan Es stellt sich die Frage, ob es möglich ist, auf beiden Kanälen so auszuwählen, dass r ausgewählt wird, wenn Daten zum Lesen verfügbar sind, und s ausgewählt wird, wenn Der Kanal ist nicht voll.
Lösung
Man kann dies mithilfe einer Select-Anweisung mit einem Standardfall erreichen. 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.
s := make(chanWarnung
Die Verwendung von len(r) oder cap(s) zum Überprüfen der Kanalbereitschaft und anschließendes Senden/Empfangen wird nicht empfohlen, da der Kanal zwischendurch seinen Status ändern kann die Prüfung und der Sende-/Empfangsversuch.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3