目錄
初始化和設置WaitGroup
主線程等待所有任務完成
注意事項與常見錯誤
首頁 後端開發 Golang 如何使用WaitGroup等待所有Goroutines在Golang完成的所有Goroutines?

如何使用WaitGroup等待所有Goroutines在Golang完成的所有Goroutines?

Jun 28, 2025 am 01:48 AM
golang

在Go 中使用sync.WaitGroup 等待所有goroutine 完成任務的核心方法是:1. 初始化WaitGroup 並在啟動每個goroutine 前調用Add(1);2. 在每個goroutine 內部使用defer wg.Done() 確保任務完成後計數減一;3. 主協程調用wg.Wait() 阻塞等待所有任務完成。這種機制適用於並發執行任務並彙總結果的場景,如批量處理或併發請求。使用時需注意:Add 應在主協程中調用、Done 必須配合defer 使用、WaitGroup 應以指針方式傳遞,避免因複制值或panic 導致死鎖問題。

How to wait for all goroutines to finish in golang using a WaitGroup?

在Go 中使用sync.WaitGroup等待所有goroutine 完成任務,是一個常見且實用的做法。它適用於並發執行多個任務並等待它們全部完成的場景,比如批量處理、並發請求等。

How to wait for all goroutines to finish in golang using a WaitGroup?

核心思路是:通過計數器記錄當前未完成的任務數量,每個goroutine 完成後通知WaitGroup 減一,主協程等待計數歸零時繼續執行。

How to wait for all goroutines to finish in golang using a WaitGroup?

初始化和設置WaitGroup

要使用WaitGroup ,首先需要聲明一個變量,並在啟動每個goroutine 前調用Add(1)來增加計數器。通常做法是在主goroutine 裡初始化:

 var wg sync.WaitGroup

for _, item := range items {
    wg.Add(1)
    go func(i Item) {
        defer wg.Done()
        // 執行任務邏輯}(item)
}

注意幾點:

How to wait for all goroutines to finish in golang using a WaitGroup?
  • 每次啟動一個goroutine 就必須調用一次Add(1)
  • 通常配合defer wg.Done()使用,確保即使發生panic 也能減一。
  • 如果在循環中創建goroutine,記得傳參進去,避免閉包問題。

主線程等待所有任務完成

設置完所有goroutine 後,在主線程中調用wg.Wait()即可阻塞等待所有任務完成:

 wg.Wait()
fmt.Println("所有goroutine已完成")

這一步常用於:

  • 在main 函數最後等待後台任務結束再退出程序
  • 在某個函數中並發處理多個子任務,等待全部完成後匯總結果

例如,你可能在做爬蟲聚合數據時,同時發起多個HTTP 請求,然後等待都返回後再處理結果。


注意事項與常見錯誤

雖然WaitGroup用起來簡單,但有幾點容易出錯:

  • Add 的時機不對:不能在goroutine 內部調用Add ,否則可能導致race condition 或計數不准確。
  • Done 沒有用defer 包裹:如果goroutine 中有panic,沒defer 可能導致Done 沒執行,Wait 一直阻塞。
  • WaitGroup 傳遞方式錯誤:應該以指針方式傳入goroutine,不要復制值。

舉個例子,下面這種寫法會導致死鎖:

 // 錯誤示例func badExample() {
    var wg sync.WaitGroup
    go func() {
        wg.Add(1) // 不在主線程Add,可能還沒執行就調用了Wait
        // do something
        wg.Done()
    }()
    wg.Wait() // 可能永遠等不到}

基本上就這些。掌握好AddDoneWait的使用順序和位置,就能很好地控制並發流程。這個機制不復雜,但稍不注意就會出問題,特別是並發環境下調試不易。

以上是如何使用WaitGroup等待所有Goroutines在Golang完成的所有Goroutines?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

PHP教程
1535
276
將Golang服務與現有Python基礎架構集成的策略 將Golang服務與現有Python基礎架構集成的策略 Jul 02, 2025 pm 04:39 PM

TOIntegrategolangServicesWithExistingPypythoninFrasture,userestapisorgrpcForinter-serviceCommunication,允許GoandGoandPyThonAppStoStoInteractSeamlessSeamLlyThroughlyThroughStandArdArdAdrotized Protoccols.1.usererestapis(ViaFrameWorkslikeSlikeSlikeGiningOandFlaskInpyThon)Orgrococo(wirs Propococo)

了解Web API的Golang和Python之間的性能差異 了解Web API的Golang和Python之間的性能差異 Jul 03, 2025 am 02:40 AM

Golangofferssuperiorperformance,nativeconcurrencyviagoroutines,andefficientresourceusage,makingitidealforhigh-traffic,low-latencyAPIs;2.Python,whileslowerduetointerpretationandtheGIL,provideseasierdevelopment,arichecosystem,andisbettersuitedforI/O-bo

內存足跡比較:在Golang和Python中運行相同的Web服務工作負載 內存足跡比較:在Golang和Python中運行相同的Web服務工作負載 Jul 03, 2025 am 02:32 AM

Gousessigantallymorythanpythanpythonwhenrunningwebservicesduetolanguigedesignesignandconcurrencymodeldifferences.1.go'sgoroutinesarelelightwithwithminimalstackoverhead,允許效率效率,使得十種

機器學習庫的狀態:Golang的產品與廣泛的Python生態系統 機器學習庫的狀態:Golang的產品與廣泛的Python生態系統 Jul 03, 2025 am 02:00 AM

Pythonisthedominantlanguageformachinelearningduetoitsmatureecosystem,whileGoofferslightweighttoolssuitedforspecificusecases.PythonexcelswithlibrarieslikeTensorFlow,PyTorch,Scikit-learn,andPandas,makingitidealforresearch,prototyping,anddeployment.Go,d

了解內存管理差異:Golang的GC與Python的參考計數 了解內存管理差異:Golang的GC與Python的參考計數 Jul 03, 2025 am 02:31 AM

Go和Python在內存管理上的核心差異在於垃圾回收機制不同。 Go使用並發標記清除(MarkandSweep)GC,自動運行並與程序邏輯並發執行,有效處理循環引用,適合高並發場景,但無法精確控制回收時間;而Python主要依賴引用計數,對象引用歸零即刻釋放,優點是即時回收且實現簡單,但存在循環引用問題,需借助gc模塊輔助清理。實際開發中,Go更適合高性能服務端程序,Python則適用於腳本類或性能要求不高的應用。

構建命令行工具:Golang比Python的優勢進行分發 構建命令行工具:Golang比Python的優勢進行分發 Jul 02, 2025 pm 04:24 PM

構建分髮用的命令行工具時,Golang比Python更合適,原因包括:1.分發簡單,Go編譯後生成單一靜態二進製文件,無需額外依賴;2.啟動速度快,資源佔用低,Go是編譯型語言,執行效率高且內存佔用小;3.支持跨平台編譯,無需額外打包工具,只需簡單命令即可生成不同平台的可執行文件。相比之下,Python需要安裝運行時和依賴庫,啟動慢、打包流程複雜且容易出現兼容性和誤報問題,因此在部署體驗和維護成本方面不如Go。

將Python Web應用程序遷移到Golang Microservices架構 將Python Web應用程序遷移到Golang Microservices架構 Jul 03, 2025 am 01:53 AM

遷移至Golang微服務架構的核心在於明確服務邊界、選擇通信模式、管理數據流並優化部署監控。首先,通過識別業務邏輯邊界如用戶管理、支付等模塊來定義獨立服務,並遵循高內聚低耦合及領域驅動設計原則;其次,根據需求選擇REST、gRPC或消息隊列作為通信方式,例如使用事件異步通知替代直接調用;接著,各服務獨立管理數據庫並通過API或事件交換數據,採用CQRS或Saga處理分佈式事務;最後,利用Docker容器化與Kubernetes編排部署服務,結合日誌、指標和追踪工具實現全面可觀測性。

Golang指針指向接口說明 Golang指針指向接口說明 Jul 21, 2025 am 03:14 AM

接口不是指針類型,它包含動態類型和值兩個指針。 1.接口變量內部保存具體類型的類型描述符和數據指針;2.將指針賦值給接口時存儲的是指針的拷貝,接口本身不是指針類型;3.接口是否為nil需同時判斷類型和值;4.方法接收者為指針時只有指針類型能實現接口;5.實際開發中需注意接口的值副本和指針傳遞區別。理解這些能避免運行時錯誤並提升代碼安全性。

See all articles