ホームページ >バックエンド開発 >Golang >チャネルに無期限に書き込むゴルーチンを停止する

チャネルに無期限に書き込むゴルーチンを停止する

WBOY
WBOY転載
2024-02-05 23:09:07937ブラウズ

停止无限期写入通道的 goroutine

質問の内容

チャネルを無限に埋める goroutine を作成する関数があります。例:

リーリー

一定期間後に停止したいコンシューマがあるとします:

リーリー

次に、チャネルを含む goroutine リソースをクリーンアップしたいと思います。これに「完了」チャネルを追加しようとしましたが、デッドロックに遭遇しました:

リーリー

これで、動作しているように見えますが、これは // ここで をいくつかの io 操作 (例: http.get("http:// google.com"))、デッドロックに直面しています (致命的エラー: すべてのゴルーチンがスリープ状態です - デッドロック!)。 生成されたゴルーチンと foo 関数によって作成されたチャネルをクリーンアップする別の方法があるかどうか疑問に思っています。


正解


開始したゴルーチンの defaultcase に置き換えるだけです:

リーリー

default 状況で元のコードがデッドロックする理由は次のとおりです:

  • 同時実行中のゴルーチンが done チャネルに書き込みを行っていない場合、ch チャネルへの書き込みを開始したゴルーチンはすぐに default 状態に移行します。その後、ゴルーチンは、別のゴルーチンが ch から値を読み取るまで、行 ch でブロックされます。
  • メイン コルーチンは ch から 2 回読み取ります。これにより、起動されたゴルーチンで 2 つの実行ループが成功します。次に、done を書き込もうとします。この時点で開始されたゴルーチンは、select ステートメントをチェックし、default 状況に陥り、ch 行でブロックされた可能性があります。したがって、メインの goroutine も <code>done <- true 行で無期限にブロックされます。これにより、デッドロックが発生する可能性があります。

以上がチャネルに無期限に書き込むゴルーチンを停止するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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