Golang で複数のファイルを同時にダウンロードするために Goroutine と WaitGroups をどのように使用できますか?

Mary-Kate Olsen
リリース: 2024-10-26 07:22:03
オリジナル
337 人が閲覧しました

How Can Goroutines and WaitGroups Be Used to Download Multiple Files Concurrently in Golang?

Golang のゴルーチンを使用して複数のファイルを並行してダウンロードする

この記事では、Golang のゴルーチンを利用して複数のファイルをダウンロードする方法を検討します。

Dropbox からファイルをダウンロードしようとする次のコード スニペットを考えてみましょう:

<code class="go">package main

import (
    "encoding/json"
    "fmt"
    "io"
    "io/ioutil"
    "net/http"
    "net/url"
    "os"
    "path/filepath"
    "sync"
)

...
func main() {

    ...
    for i, file := range flr.FileList {

        go download_file(file, tr)

        if i >= 2 {
            break
        }
    }
   ...
}</code>
ログイン後にコピー

ただし、ゴルーチンを使用してこのコードを実行しようとすると、失敗します。これは、ファイルのダウンロードを担当するゴルーチンがタスクを完了する前にメインのゴルーチンが終了するためです。

この問題に対処し、メインのゴルーチンが終了する前にゴルーチンが完了するのを確実に待機するようにするには、同期を使用できます。 WaitGroup は次のとおりです。

<code class="go">package main

import (
    ...
    "sync"
)

...
func main() {

    ...
    var wg sync.WaitGroup
    for i, file := range flr.FileList {
        wg.Add(1)

        go download_file(file, tr, &wg)

        if i >= 2 {
            break
        }
    }
    wg.Wait()
    ...
}</code>
ログイン後にコピー

ここでは、sync.WaitGroup を作成し、それを使用してまだタスクを完了していないゴルーチンの数を追跡します。これにより、メインの goroutine は、すべての goroutine がタスクを完了するまで待ってから終了することができます。

変更された download_file 関数では、wg.Done() を呼び出して goroutine の完了を通知し、wg カウンタをデクリメントします。

ゴルーチンと待機グループを利用することで、複数のファイルを効果的に同時にダウンロードでき、ダウンロード プロセスの全体的な効率が向上します。

以上がGolang で複数のファイルを同時にダウンロードするために Goroutine と WaitGroups をどのように使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!