1.waitgroup的作用
waitgroup是golang併發的兩種方式之一,乙個是channel,另乙個是waitgroup。
waitgroup的api只有3個,非常簡單好用,但是有各種坑。
2.waitgroup的用法
waitgroup有3個api:
1)add(delta int):增加/減少若干計數
2)done:減少 1 個計數,等價於 add(-1)
3)wait:等待,直到計數等於 0
使用這三個api,可以進行併發控制。
當計數過少時,會panic;當計數過多時,也會發生 deadlock的panic。
簡單例子如下:
var wg sync.waitgroup
func foo1()
func foo2()
func main()
3.陷阱避免
1)waitgroup 同步的是 goroutine, 如果在 goroutine 中進行 add(1) 操作,可能在這些 goroutine 還沒來得及 add(1) 已經執行 wait 操作,造成程式退出。
2)waitgroup 傳遞給goroutine的時候,應該採用引用方式,從而避免發生副本拷貝而死鎖。
Golang併發控制 context的使用
我們已經知道waitgroup可以用於併發控制,但當遇到更複雜的場景時,例如主動取消goroutine或者使超時的goroutine自動退出等,waitgroup就無能為力。這個時候,就是context大有用武之地。包context定義了context型別,它跨api邊界和程序之間攜帶截止日期,取消...
golang 閒談併發
對於併發這個概念,我想大家都對它不會陌生,今天就從簡單的火車站賣票問題出發,來談談併發。首先宣告本文的 是golang 因為最近開始用的就是golang 對於其他的語言其實也是相通的,那麼正式開始正題吧,首先我們來看看,賣一張票,總票數就減一,一般來說我們會這麼寫 package main impo...
golang 併發實踐
golang 高併發主要是依靠sync包下的api實現,首先就是waitgroup 先說說waitgroup的用途 它能夠一直等到所有的goroutine執行完成,並且阻塞主線程的執行,直到所有的goroutine執行完成。waitgroup總共有三個方法 add delta int done wa...