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 請求,并無需等待每個請求的響應即可繼續執行主程序。