チャネルを無限に埋める goroutine を作成する関数があります。例:
リーリー一定期間後に停止したいコンシューマがあるとします:
リーリー次に、チャネルを含む goroutine リソースをクリーンアップしたいと思います。これに「完了」チャネルを追加しようとしましたが、デッドロックに遭遇しました:
リーリー これで、動作しているように見えますが、これは // ここで
をいくつかの io 操作 (例: http.get("http:// google.com")
)、デッドロックに直面しています (致命的エラー: すべてのゴルーチンがスリープ状態です - デッドロック!
)。
生成されたゴルーチンと foo
関数によって作成されたチャネルをクリーンアップする別の方法があるかどうか疑問に思っています。
開始したゴルーチンの default
を case
に置き換えるだけです:
default
状況で元のコードがデッドロックする理由は次のとおりです:
done
チャネルに書き込みを行っていない場合、ch
チャネルへの書き込みを開始したゴルーチンはすぐに default
状態に移行します。その後、ゴルーチンは、別のゴルーチンが ch
から値を読み取るまで、行 ch でブロックされます。
ch
から 2 回読み取ります。これにより、起動されたゴルーチンで 2 つの実行ループが成功します。次に、done
を書き込もうとします。この時点で開始されたゴルーチンは、select
ステートメントをチェックし、default
状況に陥り、ch 行でブロックされた可能性があります。したがって、メインの goroutine も <code>done <- true
行で無期限にブロックされます。これにより、デッドロックが発生する可能性があります。
以上がチャネルに無期限に書き込むゴルーチンを停止するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。