Goroutine でパイプ io.Copy を待機しているときのデッドロックは、一般的な問題です。 Goroutine で io.Copy の完了を待つとき、パイプが適切に閉じられていないとデッドロックが発生します。この場合、Goroutine はデータを待ち続けることになり、実行を続行できません。この問題の解決策は、io.Copy の完了後にパイプを手動で閉じて、Goroutine が適切に終了できるようにすることです。 PHP エディターの Apple は、この種のデッドロック状況にうまく対処できるよう、この問題の原因と解決策を詳しく紹介しています。
以下のコードでは、io.copy
への呼び出しが返されることはなく、無期限にブロックされるだけで、デッドロックが発生します。この現象は、io.reader
が io.pipe
を使用して os.stdout
io.writer
に接続されている場合にのみ発生します。ただし、コード全体では io.multiwriter
と io.pipe
s を使用して io.reader
を接続するため、多くの関数が必要とするため、パイプを使用する必要があります。 io.reader
。
出力:
リーリーコードへのプレイグラウンド リンクは次のとおりです: https://goplay.tools/snippet/70ubgiz8ftv
io.pipe
を保持しながらデッドロックを回避する方法はありますか?
完了後にパイプの書き込み側を閉じます:
リーリーそうしないと、リーダーは無期限に待機することになります。
以上がGoroutine のパイプ io.Copy の待機中にデッドロックが発生するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。