成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go語(yǔ)言中通過WaitGroup控制并發(fā)

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

與Channel區(qū)別

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

基本使用示例

我們將之前的示例加以改造,引入sync.WaitGroup來(lái)實(shí)現(xiàn)并發(fā)控制。

? 首先我們?cè)谥骱瘮?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í),需要以指針方式傳遞,否則會(huì)造成Deadlock

多任務(wù)示例

如果不想在函數(shù)中傳遞WaitGroup,也可以采用以下這種方式,通過并發(fā)匿名函數(shù)的方式,在主函數(shù)邏輯中對(duì)并發(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


責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2023-12-21 07:09:32

Go語(yǔ)言任務(wù)

2021-07-15 23:18:48

Go語(yǔ)言并發(fā)

2024-09-06 10:48:13

2014-04-09 09:32:24

Go并發(fā)

2023-10-20 13:35:19

GoWaitGroup

2023-01-12 08:52:50

GoroutinesGo語(yǔ)言

2024-06-17 08:40:16

2024-04-07 11:33:02

Go逃逸分析

2021-06-29 23:40:19

Golang語(yǔ)言并發(fā)

2023-01-31 08:48:49

Go語(yǔ)言文件

2023-11-30 08:09:02

Go語(yǔ)言

2022-07-19 12:25:29

Go

2024-04-01 00:02:56

Go語(yǔ)言代碼

2023-07-29 15:03:29

2021-06-08 07:45:44

Go語(yǔ)言優(yōu)化

2024-06-05 11:06:22

Go語(yǔ)言工具

2023-12-30 18:35:37

Go識(shí)別應(yīng)用程序

2013-06-25 09:52:32

GoGo語(yǔ)言Go編程

2024-01-08 07:02:48

數(shù)據(jù)設(shè)計(jì)模式

2021-07-13 06:44:04

Go語(yǔ)言數(shù)組
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 中文字幕一区二区三区乱码在线 | 久久成人精品视频 | 久久精品一区二区 | 日韩在线观看一区 | 国产乱码精品一区二区三区忘忧草 | 超碰在线观看97 | 久久97精品| 日韩精品一区在线 | 欧美一级片在线观看 | 中文字幕日韩一区 | 久久福利电影 | 免费看一级毛片 | 超碰在线免费公开 | 国产精品无码久久久久 | 久久精品小视频 | 国产999精品久久久久久 | 国产精品久久久久久久久久尿 | 日韩成人性视频 | 国产区在线观看 | 99精品国产一区二区青青牛奶 | 久久久亚洲| 日韩视频1 | 免费小视频在线观看 | av一级久久 | 亚洲天堂一区 | 日韩高清一区二区 | 日韩精品一区二区三区中文在线 | 91麻豆精品国产91久久久久久久久 | 国产精品国产三级国产aⅴ中文 | 亚洲免费人成在线视频观看 | 91爱啪啪 | 不卡av电影在线播放 | 亚洲精选一区 | 请别相信他免费喜剧电影在线观看 | 国产精品一区一区 | 久久久久综合 | 九九天堂网 | 黄色电影在线免费观看 | 日本电影免费完整观看 | 欧美高清一级片 | 天天夜夜操 |