Go 中使用 Goroutines 並行檔案下載
在 Go 中,可以使用 Goroutines 並行下載並儲存檔案。 Goroutines 允許輕量級執行緒執行,促進並行處理並提高效能。
這是您提供的程式碼,經過修改以利用 goroutine:
package main
import (
"encoding/json"
"fmt"
"io"
"io/ioutil"
"net/http"
"net/url"
"os"
"path/filepath"
"sync"
)
// Credentials
const app_key string = ""
const app_secret string = ""
// Authorization code
var code string
// Token response
type TokenResponse struct {
AccessToken string `json:"access_token"`
}
// File structure
type File struct {
Path string
}
// File list response
type FileListResponse struct {
FileList []File `json:"contents"`
}
// Download a file using goroutines
func download_file(file File, token TokenResponse, wg *sync.WaitGroup) {
download_file := fmt.Sprintf("https://api-content.dropbox.com/1/files/dropbox/%s?access_token=%s", file.Path, token.AccessToken)
resp, _ := http.Get(download_file)
defer resp.Body.Close()
filename := filepath.Base(file.Path)
out, err := os.Create(filename)
if err != nil {
panic(err)
}
defer out.Close()
io.Copy(out, resp.Body)
wg.Done()
}
func main() {
// Authorization and token retrieval
authorize_url := fmt.Sprintf("https://www.dropbox.com/1/oauth2/authorize?response_type=code&client_id=%s", app_key)
fmt.Printf("1. Go to: %s\n", authorize_url)
fmt.Println("2. Click 'Allow' (you might have to log in first)")
fmt.Println("3. Copy the authorization code.")
fmt.Printf("Enter the authorization code here: ")
fmt.Scanf("%s", &code)
// Get file list
file_list_url := fmt.Sprintf("https://api.dropbox.com/1/metadata/dropbox/Camera Uploads?access_token=%s", tr.AccessToken)
resp2, _ := http.Get(file_list_url)
defer resp2.Body.Close()
contents2, _ := ioutil.ReadAll(resp2.Body)
var flr FileListResponse
json.Unmarshal(contents2, &flr)
// WaitGroup to wait for all goroutines to finish
var wg sync.WaitGroup
// Download files concurrently
for i, file := range flr.FileList {
wg.Add(1)
go download_file(file, tr, &wg)
if i >= 2 {
break
}
}
wg.Wait()
}
在這段修改後的程式碼中,我們加入了一個名為 wg 的sync.WaitGroup來追蹤正在執行的goroutines的數量。我們在啟動每個 goroutine 之前遞增 wg,並在每個 goroutine 使用 wg.Done() 完成時遞減 wg。主協程透過呼叫 wg.Wait() 等待所有協程完成。這可以確保在下載所有文件之前程式不會退出。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3