はじめに
Goroutine は Go の強力な同時実行プリミティブであり、これにより次のことが可能になります。複数のタスクを同時に実行し、アプリケーションのパフォーマンスとリソースの使用率を向上させます。この記事では、ゴルーチンの力を利用して、リモート サーバーから複数のファイルを並行してダウンロードする方法を説明します。
問題点
Dropbox からファイルをダウンロードするプログラムがあります。 HTTP GET リクエストを使用します。ただし、ダウンロードが並行して行われていないため、最適なパフォーマンスが得られないことがわかります。私たちの目標は、ゴルーチンを利用してダウンロードを同時に実行するようにコードを変更することです。
コードの説明
提供されたコードには、Dropbox からのファイルの認証とダウンロードを担当するいくつかの関数が含まれています。 :
ゴルーチンの実装
並列ダウンロードを有効にするには、go キーワードを download_file( ) 関数。ただし、ダウンロードが完了する前にメインの goroutine が終了し、プログラムが途中で終了してしまうため、このアプローチは失敗します。
この問題に対処するために、sync.WaitGroup を組み込んで goroutine を同期し、メインの goroutine が確実に待機するようにします。すべてのダウンロードが完了するまで。 WaitGroup はダウンロード タスクごとにカウンターを追加し、ダウンロードが完了すると各 goroutine がカウンターをデクリメントします。メインの goroutine は WaitGroup でブロックし、カウンタがゼロになるのを待ちます。これにより、プログラムは終了する前にすべてのダウンロードを完了できます。
変更されたコード
変更されたコードは次のとおりです。 goroutine 実装と WaitGroup 同期を使用したコード:
<code class="go">package main import ( "encoding/json" "fmt" "io" "io/ioutil" "net/http" "net/url" "os" "path/filepath" "sync" ) const app_key string = "<app_key>" const app_secret string = "<app_secret>" var code string type TokenResponse struct { AccessToken string `json:"access_token"` } type File struct { Path string } type FileListResponse struct { FileList []File `json:"contents"` } func download_file(file File, token TokenResponse, wg *sync.WaitGroup) { // Download the file and save it locally. ... wg.Done() // Decrement the WaitGroup counter. } func main() { ... // Get file list. ... // Use a WaitGroup to synchronize the goroutines. var wg sync.WaitGroup for i, file := range flr.FileList { wg.Add(1) // Increment the WaitGroup counter. go download_file(file, tr, &wg) // Note the addition of the WaitGroup pointer. if i >= 2 { break } } wg.Wait() // Block the main goroutine until all downloads are complete. }</code>
結論
Goroutine と WaitGroup を組み込むことで、プログラムは複数のファイルを並行してダウンロードするようになり、パフォーマンスが大幅に向上し、 Go の同時実行機能を活用します。このアプローチは、複数のタスクを同時に実行する必要がある他のさまざまなシナリオに適用できます。
以上がGoroutines と WaitGroup を使用して、Go で複数のファイルを同時にダウンロードするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。