ホームページ >バックエンド開発 >Golang >Go sync.WaitGroup が完了しないのはなぜですか?

Go sync.WaitGroup が完了しないのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-08 10:46:12961ブラウズ

Why Is My Go sync.WaitGroup Never Completing?

「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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。