ホームページ > バックエンド開発 > Golang > Go でバッファリングされた送信チャネルとバッファリングされていない受信チャネルを同時に選択するにはどうすればよいですか?

Go でバッファリングされた送信チャネルとバッファリングされていない受信チャネルを同時に選択するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-10-29 07:20:30
オリジナル
215 人が閲覧しました

How to Select on a Buffered Send and Unbuffered Receive Channel Simultaneously in Go?

Go の送信チャネルと受信チャネルを同時に選択する

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート