チャネルの準備が整った非同期通信
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 サイトの他の関連記事を参照してください。