ホームページ >バックエンド開発 >Golang >CPU 使用率を最小限に抑えながら、Go でチャネルの準備を整えた非同期通信を実現するにはどうすればよいですか?

CPU 使用率を最小限に抑えながら、Go でチャネルの準備を整えた非同期通信を実現するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-27 05:34:031035ブラウズ

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

チャネルの準備が整った非同期通信

Go では、チャネルはゴルーチン間の同時通信を促進します。バッファリングされた送信チャネルとバッファリングされていない受信チャネルを処理する場合、両方のチャネルを同時に選択して通信フローを最適化することができます。この記事では、CPU 使用率を最小限に抑えながらこの機能を実装するアプローチについて説明します。

問題を理解するには、次のコンテキストを考慮してください:

<code class="go">s := make(chan<- int, 5) // Buffered send channel
r := make(<-chan int)   // Unbuffered receive channel</code>

両方を選択できるかどうかという疑問が生じます。データが読み取れるときに r が選択され、チャネルがいっぱいでないときに s が選択されるようなチャネルです。

解決策

select を使用してこれを実現できます。デフォルトのケースを使用したステートメント。 select を使用する場合、送信される値は 1 回だけ評価されるため、両方のチャネルの準備ができていない場合、値は古くなります。これを回避するために、どちらのチャネルも準備ができていない場合に実行されるデフォルトのケースが選択ステートメントに追加されます。このデフォルトのケースでは、プログラムは短期間スリープしてチャネルの準備が整った後、更新された値で再試行します。

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

警告

len(r) または cap(s) を使用してチャネルの準備状況をチェックしてから送受信することは、チェックと送受信の試行の間にチャネルの状態が変わる可能性があるため、推奨されません。

以上がCPU 使用率を最小限に抑えながら、Go でチャネルの準備を整えた非同期通信を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。