Go 言語: バッファリングされたチャネルとバッファリングされていないチャネルでの同時選択
当面のタスクは、バッファリングされた送信チャネルとバッファリングされたチャネルでの同時選択を実現することです。 CPU リソースを常に消費することなく、バッファリングされていない受信チャネルを実現します。このシナリオは、チャネルが送信の準備ができるまでデータを送信せずにブロックすることと同じです。
これに対処するには、デフォルトのケースで select ステートメントを使用できます。どちらのチャネルも準備ができていない場合は、デフォルトのケースがトリガーされ、短いスリープ期間が開始されます。これにより、データの送受信を継続的に試行しながらリソースを節約できます。
<code class="go">package main import ( "fmt" "time" ) func valueToSend() int { // Generate a value to send, calculated/acquired each attempt return 0 } func main() { s := make(chan<- int, 5) r := make(<-chan int) for { v := valueToSend() // Updated value for each send attempt select { case s <- v: fmt.Println("Sent value:", v) case vr := <-r: fmt.Println("Received:", vr) default: // None of the channels are ready time.Sleep(time.Millisecond * 1) } } }</code>
データを送受信する前にチャネル長または容量のチェックに依存する場合は注意が必要です。このようなアプローチでは、チェックと実際の送受信操作の間にチャネル状態が変化する可能性があるため、予期しない動作が発生する可能性があります。
以上がGo でバッファリングされた送信チャネルとバッファリングされていない受信チャネルを効率的に選択するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。