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

Go語言中通過WaitGroup控制并發

開發 前端
Channel能夠很好的幫助我們控制并發,但是在開發習慣上與顯示的表達不太相同,所以在Go語言中可以利用sync包中的WaitGroup實現并發控制,更加直觀。

與Channel區別

Channel能夠很好的幫助我們控制并發,但是在開發習慣上與顯示的表達不太相同,所以在Go語言中可以利用sync包中的WaitGroup實現并發控制,更加直觀。

基本使用示例

我們將之前的示例加以改造,引入sync.WaitGroup來實現并發控制。

? 首先我們在主函數中定義WaitGroup

var wg sync.WaitGroup

? 每執行一個任務,則調用Add()方法

wg.Add(1)

? 在主函數中我們利用Wait()方法等待并發結束

wg.Wait()

? 在調用的函數中,我們需要將WaitGroup以指針方式傳入,否則將造成Deadlock

// 主函數內
go ready(5, &wg)
// 函數
func ready(s int, wg *sync.WaitGroup)

? 同時在函數執行完成后,調用wg.Done,我們使用defer實現

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傳入給函數時,需要以指針方式傳遞,否則會造成Deadlock

多任務示例

如果不想在函數中傳遞WaitGroup,也可以采用以下這種方式,通過并發匿名函數的方式,在主函數邏輯中對并發進行精準控制

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()
}

運行結果如下

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


責任編輯:武曉燕 來源: 今日頭條
相關推薦

2021-07-15 23:18:48

Go語言并發

2023-12-21 07:09:32

Go語言任務

2024-09-06 10:48:13

2014-04-09 09:32:24

Go并發

2023-10-20 13:35:19

GoWaitGroup

2024-04-07 11:33:02

Go逃逸分析

2024-06-17 08:40:16

2023-01-12 08:52:50

GoroutinesGo語言

2023-11-30 08:09:02

Go語言

2022-07-19 12:25:29

Go

2024-04-01 00:02:56

Go語言代碼

2021-06-08 07:45:44

Go語言優化

2023-07-29 15:03:29

2021-06-29 23:40:19

Golang語言并發

2023-01-31 08:48:49

Go語言文件

2024-06-05 11:06:22

Go語言工具

2012-06-15 09:56:40

2023-12-25 09:58:25

sync包Go編程

2025-02-13 09:02:04

2024-05-10 08:36:40

Go語言對象
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧美网站 | 久久久精品网站 | av一区二区三区 | 国产成人自拍一区 | 精品国产一区二区三区av片 | 欧美在线观看一区二区 | 亚洲一级淫片 | 欧美一级片在线 | 成人av一区二区亚洲精 | 免费观看羞羞视频网站 | 欧美成人视屏 | 中文字幕11页 | 久久久久亚洲精品 | 99re在线播放 | 国产露脸国语对白在线 | 成人国内精品久久久久一区 | 亚洲精品一区在线观看 | 日韩精品 电影一区 亚洲 | 亚洲视频一区在线观看 | 欧美一级在线免费观看 | 国产一区二区视频免费在线观看 | 一级全黄少妇性色生活免费看 | www亚洲成人| 日韩精品一区二区三区中文字幕 | 国产精品视频免费观看 | 在线免费国产视频 | 欧美一区二区三区四区五区无卡码 | a级黄色毛片免费播放视频 国产精品视频在线观看 | 国产探花在线精品一区二区 | 亚洲黄色一级毛片 | 亚洲在线高清 | 国产一区在线免费观看视频 | 自拍偷拍亚洲一区 | 精品久久香蕉国产线看观看亚洲 | 91视视频在线观看入口直接观看 | 一级片在线观看 | 中国一级特黄真人毛片 | 亚洲高清视频一区二区 | 国产精品夜夜夜一区二区三区尤 | 国产在线1 | 福利av在线|