Go では、select ステートメントを使用してチャネル上でノンブロッキング I/O 操作を実行できます。ただし、バッファリングされた送信チャネル (chan
一般的なアプローチの 1 つは、送信または受信する前にチャネルの長さまたは容量を確認することです。ただし、チェックとその後の操作の間でチャネルの状態が変化する可能性があるため、これは信頼できません。
<code class="go">if len(r) > 0 { // Optionally execute other code r <- v // May block if another goroutine received from r in the meantime }</code>
この問題を解決するには、次のことができます。短い時間遅延を含むデフォルトのケースで select ステートメントを使用します。これにより、過剰な CPU 使用率が防止され、両方のチャネルの準備ができていない場合に操作を再試行できます。
<code class="go">s := make(chan<- int, 5) r := make(<-chan int) for { v := valueToSend() select { case s <- v: fmt.Println("Sent value:", v) case vr := <-r: fmt.Println("Received:", vr) default: // If none are ready, delay execution time.Sleep(time.Millisecond * 1) } }</code>
デフォルトのケースを追加すると、両方のチャネルの準備ができていない場合、プログラムは短期間のみブロックされます。チャネルが使用可能になるのを待機している間に CPU リソースを解放できるようにします。
以上がGo でバッファリングされた送信チャネルとバッファリングされていない受信チャネルを同時に選択するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。