新聞中心
與Channel區(qū)別
Channel能夠很好的幫助我們控制并發(fā),但是在開發(fā)習(xí)慣上與顯示的表達(dá)不太相同,所以在Go語言中可以利用sync包中的WaitGroup實(shí)現(xiàn)并發(fā)控制,更加直觀。

創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比興山網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式興山網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋興山地區(qū)。費(fèi)用合理售后完善,10多年實(shí)體公司更值得信賴。
基本使用示例
我們將之前的示例加以改造,引入sync.WaitGroup來實(shí)現(xiàn)并發(fā)控制。
? 首先我們在主函數(shù)中定義WaitGroup
var wg sync.WaitGroup
? 每執(zhí)行一個(gè)任務(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í)在函數(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ù)時(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
當(dāng)前題目:Go語言中通過WaitGroup控制并發(fā)
網(wǎng)站網(wǎng)址:http://fisionsoft.com.cn/article/dhicjos.html


咨詢
建站咨詢
