一定数の go ルーチンだけ (たとえば 5 つ) を作成したいのですが、ジョブの数は可変です。
これがこれを実行しようとするコードです。テストはその下にあります。
リーリーこれをテストします
リーリーテスト jobs 10 Capacity 5
は機能しますが、jobs 100 Capacity 5
は失敗します。
100 ジョブに対してキャパシティ 50 を設定すると機能しますが、30 ジョブに対しては機能せず、動作が理解できません。
以下は、このチャネルについての私の理解と、それが機能するという私の期待です。
バッファ チャネルがいっぱいの場合、空き容量が利用可能になるまでブロックされます。ジョブ チャネルがいっぱいになると、チャンワーカーがジョブ チャネルの一部を解放するまでブロックされることが予想されます。チャンワーカー自体は容量を受け取り、空の構造体を使用して、ワーカー スレッドが 5 つ以下しか作成されないようにします。
エラーが発生するのはなぜですか?
致命的エラー: すべてのゴルーチンがスリープ状態です - デッドロック!
?
すべてのジョブが jobs# に送信されるまで、メインの goroutine は
results から値を受け取りません。 ##、したがって、ワーカー スレッドは
results への送信中にブロックされます。ジョブがブロックされているため、メインの goroutine は
jobs への送信をブロックします。デッドロック!
リーリー
https://www.php.cn/link/6e04df31f1bbb1c02666d0dfa3638f76
以上がすべてのゴルーチンがスリープ状態です - デッドロック、バッファリングされたチャネル上で、理由がわかりませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。