ホームページ > バックエンド開発 > Golang > ファイルを同時にダウンロードすると Go WaitGroup が完了しないのはなぜですか?

ファイルを同時にダウンロードすると Go WaitGroup が完了しないのはなぜですか?

Barbara Streisand
リリース: 2024-11-28 07:35:12
オリジナル
751 人が閲覧しました

Why Doesn't My Go WaitGroup Complete When Downloading Files Concurrently?

WaitGroup Not Completing in Go Concurrency

提供されたコードは、URL のリストから複数のファイルを同時にダウンロードして保存しようとします。ただし、sync.WaitGroup が完了しないため、メインの goroutine は終了しません。

特定された 2 つの問題:

  1. 同期の問題:
    downloadFromURL() では、wg.Done() 呼び出しは次のようにする必要があります。関数の最後ではなく、最初のステートメントの 1 つとして呼び出されます。これにより、関数が早く戻った場合でも、WaitGroup が正しくデクリメントされるようになります。
  2. 同時実行ポインター:
    downloadFromURL() 関数は、共有ファイルを操作するために sync.WaitGroup へのポインターを受け取る必要があります。正しく対象にします。それ以外の場合、WaitGroup を値で渡すとコピーが作成され、コピーに加えられた変更はメインの goroutine に反映されません。

最適化コード:

func downloadFromURL(url string, wg *sync.WaitGroup) error {
    defer wg.Done()  // Moved to the beginning of the function

    ... // Other code
}

func main() {
    ...

    for _, url := range links {
        if isExcelDocument(url) {
            wg.Add(1)
            go downloadFromURL(url, &wg)  // Pass pointer to WaitGroup
        } else {
            fmt.Printf("Skipping: %v \n", url)
        }
    }
    ...
}
ログイン後にコピー

これらの問題に対処することで、WaitGroup は実行中のゴルーチンの数とメインのゴルーチンを正確に追跡できるようになります。すべてのダウンロードが完了すると終了します。

以上がファイルを同時にダウンロードすると Go WaitGroup が完了しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート