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

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

WBOY
WBOY転載
2024-02-09 09:42:30659ブラウズ

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

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

質問内容

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

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

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

決して呼び出されない

は、まあ、決して呼び出されません。 ###編集### <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>

Solution

ループ for sourceResults := range resultsStream

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

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

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

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。