golang併發控制方法WaitGroup

2021-09-24 15:10:58 字數 626 閱讀 8554

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...