go 協程等待

2021-09-11 23:58:04 字數 718 閱讀 3374

sync包提供了基本的同步基元,如互斥鎖

但是這裡不是討論執行緒通訊的問題(而執行緒通訊應使用channel)

以前使用time.sleep(...)來保證執行緒執行完成, 顯然執行緒執行所需要的時間不確定

sync裡面有乙個waitgroup, 它是乙個結構體, 可以用於等待執行緒執行

這樣不用去估算執行緒需要執行多久

原理:

package main

import (

"fmt"

"sync"

)func main() // 建立結構體例項, 用於控制協程任務

wg.add(20) // 新增20個協程任務

for i:=0; i<10; i++ ()

}for k:=0; k<10; k++ (k)

} wg.wait() // 等待協程完成(處於阻塞狀態, 直到全部協程任務完成)

}

注: 協程建立時, 不是馬上執行, 一般是該協程處於就緒狀態

同樣, 在迴圈中建立的協程, 一般也不會馬上執行

即迴圈不會等待協程執行, 而會繼續下一次迴圈

什麼時候執行協程, 這也是看系統排程(可能迴圈未完成時執行協程, 也可能迴圈都完成以後才執行一次協程)

注: 建立協程時, 如果傳入了引數, 則執行協程時, 根據傳入的引數來執行

建立協程時, 如果沒有傳入引數, 則執行協程時, 根據就近引數來執行

Go 協程 通道

目錄 go 協程 go 通道 go 協程go 協程可以看作是輕量級執行緒。與執行緒相比,建立乙個go協程的成本很小。因此在go應用中,常常會看到有數以千計的go協程併發地執行 go 協程相比於執行緒的優勢 啟動乙個go協程 在呼叫函式和方法時,在前面加上關鍵字go,可以讓乙個新的go協程併發執行 p...

GO總結六協程

比執行緒更加輕量級的並行方法。go從語言層次就支援了這一操作 使用起來很簡單,就只用關鍵字go標識一下,它就自動開乙個協程去執行了 package main import fmt time func show func main 結果 注意,主協程退出後,子協程也會退出 讓出時間片,其他協程先執行 ...

go等待一組協程結束的實現方式

go提供了sync包和channel來解決協程同步和通訊。方式1 sync.waitgroup是等待一組協程結束,sync.waitgroup只有3個方法,add 新增乙個計數,done 減去乙個計數,wait 阻塞直到所有任務完成。package main import fmt sync time...