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