Go HTTP インポートによるデッドロック エラーの回避
Go では、HTTP 通信に net/http パッケージを使用すると、影響を与える可能性のある微妙な動作が導入されます。デッドロックの検出。
次のコードを考えてみましょう:
<code class="go">package main import ( "fmt" "net/http" ) func Extract(url string) ([]string, error) { http.Get(url) var links []string return links, nil } func crawl(url string) []string { list, _ := Extract(url) return list } func main() { var ch = make(chan int) ch <- 1 }</code>
net/http インポートなしでこのコードを実行すると、「デッドロック」エラーが発生します。これは、ServeHTTP または Close への対応する呼び出しがない場合、Extract 関数が HTTP リクエストでブロックされるためです。
ただし、net/http パッケージがインポートされる場合、Extract 関数を呼び出さなくても、「デッドロック」エラーが発生します。消えます。これは、ネット パッケージをインポートすると、HTTP サーバーと自動的に通信する Goroutine のバックグラウンド ポーリングが開始されるためです。
この動作は、Go ブログ投稿「Goroutine Pooling in NetHttp」:
「The net」に記載されています。このパッケージは、HTTP サーバーへの到達可能性を定期的にテストする単純なバックグラウンド ゴルーチンを開始します。この単純なテスト ゴルーチンは、HTTP サーバーに到達できない場合は終了し、サーバーが到達可能になったときに再起動します。これにより、呼び出しに net.Dial が含まれるゴルーチンが確実に実行されます。スタックがブロックされていると誤って報告されることはありません。"
net パッケージをインポートすると、HTTP 通信を含む net.Dial を使用するコードのデッドロック検出機能が効果的に無効になります。
より厳格な要求を必要とするアプリケーションの場合デッドロックが検出されるため、HTTP サーバーとの通信を確立する必要があるまでは、ネット パッケージのインポートを避けることをお勧めします。
以上がGo で net/http パッケージをインポートすると、デッドロック エラーの検出にどのような影響がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。