go 函數中的高效并行任務處理:使用 go 關鍵字啟動并發例程。使用 sync.waitgroup 計數未完成例程的數量。例程完成時調用 wg.done() 遞減計數器。主程序使用 wg.wait() 阻塞,直到所有例程完成。實戰案例:并發發送 web 請求并收集響應。
Go 函數中的高效并行任務處理
Go 語言提供了強大的并行處理能力,使開發人員能夠輕松地創建并執行并發任務。本文將討論如何使用 Go 函數高效地處理并行任務,并提供一個實戰案例來演示它的用法。
Go 函數中的并發
Go 函數提供了兩個關鍵字來支持并發執行:go 和 sync.WaitGroup。go 關鍵字用于啟動并發的 Go 例程,而 sync.WaitGroup 用于等待所有例程完成。
等待組
sync.WaitGroup 是一個計數器,用于跟蹤未完成例程的數量。當例程完成時,它會調用 wg.Done() 來遞減計數器。主程序可以使用 wg.Wait() 方法來阻塞,直到所有例程完成。
實戰案例:并發 Web 請求
考慮一個場景,我們需要并發發送多個 Web 請求并收集響應。以下是演示如何使用 Go 函數進行高效并發任務處理的代碼:
package main
import (
"fmt"
"net/http"
"sync"
)
func main() {
// 要發送的 Web 請求 URL
urls := []string{"https://example.com", "https://example2.com", "https://example3.com"}
// 創建等待組
var wg sync.WaitGroup
for _, url := range urls {
// 啟動一個并發例程來發送 Web 請求
wg.Add(1)
go func(url string) {
// 發送 GET 請求
resp, err := http.Get(url)
if err != nil {
fmt.Printf("Error getting %s: %v\n", url, err)
} else {
fmt.Printf("Status code for %s: %d\n", url, resp.StatusCode)
}
// 例程完成,遞減等待組計數
wg.Done()
}(url)
}
// 等待所有例程完成
wg.Wait()
}
登錄后復制
在上面的代碼中:
我們使用 sync.WaitGroup 來跟蹤未完成例程的數量。
對于每個 Web 請求 URL,我們啟動一個并發的 Go 例程來發送請求。
例程使用 wg.Done() 來表示它已完成。
主程序使用 wg.Wait() 阻塞,直到所有例程完成。
通過使用這種方法,我們可以并發發送多個 Web 請求,并無需等待每個請求的響應即可繼續執行主程序。






