ネット パッケージ インポートとデッドロック検出の相互作用
Go プログラムでは、プログラムの実行中にチャネル操作がブロックされると、プログラムは最終的には「デッドロック」エラーが発生します。ただし、ネット パッケージがインポートされると動作が変わります。
問題のコード スニペット:
package main
import (
"fmt"
"net/http"
)
func main() {
var ch = make(chan int)
ch net/http パッケージがインポートされていない場合、プログラムは「デッドロック」エラーで終了します。これは、チャネル操作 (バッファリングされていないチャネルへの送信) が永久にブロックされ、デッドロック検出機能が問題を特定できる非同期操作を実行する他のゴルーチンが実行されていないためです。
ただし、net/httpパッケージがインポートされると、プログラムはデッドロックしません。これは、ネット パッケージをインポートすると、デッドロック検出機能を効果的に無効にするバックグラウンド ポーリングのゴルーチンが開始されるためです。
ネット パッケージにはネットワーク接続を管理する機能が含まれており、ゴルーチンを使用して接続を非同期に処理します。これらのバックグラウンド ポーリングのゴルーチンは、現在 HTTP 接続が確立または処理されていない場合でも実行を継続するため、デッドロック検出器にはプログラムがブロックされていないように見えます。その結果、チャネル操作がブロックされているにもかかわらず、プログラムは「デッドロック」エラーで終了しません。
この動作は、GitHub の問題 https://github.com/golang/go/issues で議論されています。 /12734.
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3