Golang sync.WaitGroup Never Completes
提供されたコードは、URL のリストを取得し、条件付きでファイルをダウンロードしてファイルに保存することで同時実行性を示します。システム。メインのゴルーチンは、sync.WaitGroup を使用してすべてのファイルがフェッチされるのを待ちます。ただし、すべてのリクエストが完了した後でもプログラムは終了できません。
この問題を理解するには、WaitGroup の機能を考慮してください。実行中のゴルーチンの数を維持します。カウントがゼロに達すると、waitgroup はすぐに戻り、すべてのゴルーチンの実行が完了したことを示します。
指定されたコードでは、WaitGroup の Add メソッドを使用してカウントをインクリメントし、Done メソッドを使用してカウントをデクリメントします。 。 Add メソッドが Done メソッドよりも多く呼び出された場合、またはその逆の場合、WaitGroup はゼロに達せず、メインのゴルーチンが無期限に待機することになります。
提供されたコードには 2 つのエラーがあります。
func main() { ... go downloadFromURL(url, &wg) ... }
func downloadFromURL(url string, wg *sync.WaitGroup) error { defer wg.Done() ... }
これらの修正を適用すると、WaitGroup は正しく機能し、ゴルーチンが完了するにつれてカウントが減ります。タスクを実行し、最終的にメインのゴルーチンの正常な終了につながります。
以上がMy Go sync.WaitGroup が完了しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。