「golang sync.WaitGroup が完了しない」問題のデバッグ
同時 Go プログラムでは、sync.WaitGroup により、メインの goroutine が他の goroutine を待機するようになります。 goroutines の実行を終了します。ただし、場合によっては、メインの goroutine が無期限にハングし、WaitGroup が意図したとおりに機能していないことを示します。
この問題の理由の 1 つは、WaitGroup の不適切な使用です。以下のコードでは、downloadFromURL 関数にポインターではなく WaitGroup のコピーが渡されるというエラーが発生します:
func main() { ... go downloadFromURL(url, wg) ... }
これにより、Done メソッドがメインの goroutine で WaitGroup にシグナルを送ることができなくなります。これを修正するには、ポインタを渡します:
func main() { ... go downloadFromURL(url, &wg) ... }
もう 1 つのエラーは、Done メソッドが downloadFromURL 関数の十分な早い段階で呼び出されないことです。エラーが発生し、Done が呼び出される前に関数が戻った場合、WaitGroup は完了を登録しません。最初のステートメントの 1 つとして Done を配置します。
func downloadFromURL(url string, wg *sync.WaitGroup) error { defer wg.Done() ... }
WaitGroup が正しく使用されていることを確認することで、デッドロックを防ぎ、プログラムが期待どおりに終了するようにすることができます。
以上がGo sync.WaitGroup が完了しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。