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

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

Barbara Streisand
Barbara Streisandオリジナル
2024-10-28 17:51:29606ブラウズ

How to Efficiently Select on Buffered Send and Unbuffered Receive Channels in Go?

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

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