Go語言通過WaitGroup實(shí)現(xiàn)控制并發(fā)的示例詳解
與Channel區(qū)別
Channel能夠很好的幫助我們控制并發(fā),但是在開發(fā)習(xí)慣上與顯示的表達(dá)不太相同,所以在Go語言中可以利用sync包中的WaitGroup實(shí)現(xiàn)并發(fā)控制,更加直觀。
基本使用示例
我們將之前的示例加以改造,引入sync.WaitGroup來實(shí)現(xiàn)并發(fā)控制。
首先我們在主函數(shù)中定義WaitGroup
var wg sync.WaitGroup
每執(zhí)行一個任務(wù),則調(diào)用Add()方法
wg.Add(1)
在主函數(shù)中我們利用Wait()方法等待并發(fā)結(jié)束
wg.Wait()
在調(diào)用的函數(shù)中,我們需要將WaitGroup以指針方式傳入,否則將造成Deadlock
// 主函數(shù)內(nèi) go ready(5, &wg) // 函數(shù) func ready(s int, wg *sync.WaitGroup)
同時在函數(shù)執(zhí)行完成后,調(diào)用wg.Done,我們使用defer實(shí)現(xiàn)
defer wg.Done()
完整代碼
package main import ( "fmt" "sync" "time" ) func ready(s int, wg *sync.WaitGroup) { defer wg.Done() fmt.Printf("Run func in a goroutine and wait for %v\n", s) time.Sleep(time.Second * time.Duration(s)) fmt.Printf("Run func in a goroutine and wait for %v end\n", s) } func main() { var wg sync.WaitGroup wg.Add(1) go ready(5, &wg) mainWaitSec := 2 fmt.Printf("Run Main function and wait for %v\n", mainWaitSec) time.Sleep(time.Second * time.Duration(mainWaitSec)) fmt.Printf("Run Main function and wait for %v done\n", mainWaitSec) wg.Wait() }
特別提示
WaitGroup傳入給函數(shù)時,需要以指針方式傳遞,否則會造成Deadlock
多任務(wù)示例
如果不想在函數(shù)中傳遞WaitGroup,也可以采用以下這種方式,通過并發(fā)匿名函數(shù)的方式,在主函數(shù)邏輯中對并發(fā)進(jìn)行精準(zhǔn)控制
var wg sync.WaitGroup for i := 0; i < 5; i++ { wg.Add(1) waitSec := i + 1 go func() { defer wg.Done() ready(waitSec) }() }
完整代碼
package main import ( "fmt" "sync" "time" ) func ready(s int) { fmt.Printf("Run func in a goroutine and wait for %v\n", s) time.Sleep(time.Second * time.Duration(s)) fmt.Printf("Run func in a goroutine and wait for %v end\n", s) } func main() { var wg sync.WaitGroup for i := 0; i < 5; i++ { wg.Add(1) waitSec := i + 1 go func() { defer wg.Done() ready(waitSec) }() } mainWaitSec := 2 fmt.Printf("Run Main function and wait for %v\n", mainWaitSec) time.Sleep(time.Second * time.Duration(mainWaitSec)) fmt.Printf("Run Main function and wait for %v done\n", mainWaitSec) wg.Wait() }
運(yùn)行結(jié)果如下
Run Main function and wait for 2
Run func in a goroutine and wait for 2
Run func in a goroutine and wait for 4
Run func in a goroutine and wait for 5
Run func in a goroutine and wait for 1
Run func in a goroutine and wait for 3
Run func in a goroutine and wait for 1 end
Run Main function and wait for 2 done
Run func in a goroutine and wait for 2 end
Run func in a goroutine and wait for 3 end
Run func in a goroutine and wait for 4 end
Run func in a goroutine and wait for 5 end
到此這篇關(guān)于Go語言通過WaitGroup實(shí)現(xiàn)控制并發(fā)的示例詳解的文章就介紹到這了,更多相關(guān)Go語言 WaitGroup控制并發(fā)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Prometheus Go client library使用方式詳解
這篇文章主要為大家介紹了Prometheus Go client library使用方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11Goland激活碼破解永久版及安裝詳細(xì)教程(親測可以)
這篇文章主要介紹了Goland激活碼破解永久版及安裝詳細(xì)教程(親測可以),本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10Golang導(dǎo)入包的幾種方式(點(diǎn),別名與下劃線)
這篇文章主要介紹了Golang導(dǎo)入包的幾種方式(點(diǎn),別名與下劃線),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02