ホームページ > バックエンド開発 > Golang > Go のバッファーされたチャネル スコープがブロックされている

Go のバッファーされたチャネル スコープがブロックされている

WBOY
リリース: 2024-02-09 09:42:30
転載
698 人が閲覧しました

Go 中缓冲通道的范围是阻塞的

php Xiaobian Yuzai Go 言語では、バッファ チャネルは強力で柔軟なツールです。バッファ付きチャネルは、データの送信と受信を同期し、通信の速度と順序を制御するメカニズムを提供します。そのスコープはブロッキングです。つまり、チャネルがいっぱいまたは空の場合、十分なスペースまたはデータが利用可能になるまで、送受信操作はブロックされます。このメカニズムにより、並行プログラムにおけるリソースの競合やデッドロックの問題を効果的に回避し、プログラムの信頼性とパフォーマンスを向上させることができます。バッファ チャネルを合理的に使用することで、開発者は並行プログラムの実行プロセスをより適切に制御し、プログラムの効率と安定性を向上させることができます。

質問内容

脳に問題があるのでしょうが、バッファチャネルの反復中にブロックされました

リーリー ###出力### リーリー

これは、2 つのソースがチャンネル (最大容量) を満たしていることを証明します。 ここで何が欠けているのでしょうか?

決して呼び出されない

は、まあ、決して呼び出されません。 ###編集### <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:golang;toolbar:false;"> results := []search.book{} resultsstream := make(chan []search.book, 2) defer close(resultsstream) // parallelize searches to optimize response time for _, src := range sources { go src.search(bookname, resultsstream) } counter := 0 for sourceresults := range resultsstream { counter = counter + 1 results = append(results, sourceresults...) fmt.println(counter) } fmt.println(&quot;never called&quot;) </pre><div class="contentsignin">ログイン後にコピー</div></div>

Solution

ループ for sourceResults := range resultsStream

チャネルから値を閉じられるまで繰り返し受信します。送信者が終了してチャネルを閉じると、ループは終了します。

並列検索ごとに新しいチャネルを作成でき、すべてのワーカー コルーチンが完了したらチャネルを閉じることができます。これにより、受信側ループが終了します (注: 送信側は知らないため、受信側からチャネルを閉じないでください。閉じられたチャネルに送信するとパニックが発生します)。

以上がGo のバッファーされたチャネル スコープがブロックされているの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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