協(xié)程
goroutine 是輕量級(jí)線程,調(diào)度由 Go 運(yùn)行時(shí)進(jìn)行管理的。Go 語(yǔ)言的并發(fā)控制主要使用關(guān)鍵字 go 開啟協(xié)程 goroutine。Go 協(xié)程(Goroutine)之間通過(guò)信道(channel)進(jìn)行通信,簡(jiǎn)單的說(shuō)就是多個(gè)協(xié)程之間通信的管道。信道可以防止多個(gè)協(xié)程訪問(wèn)共享內(nèi)存時(shí)發(fā)生資源爭(zhēng)搶的問(wèn)題。語(yǔ)法格式:
// 普通函數(shù)創(chuàng)建 goroutine
go 函數(shù)名(參數(shù)列表)
//匿名函數(shù)創(chuàng)建 goroutine
go func(參數(shù)列表){
//函數(shù)體
}(調(diào)用參數(shù)列表)
協(xié)程可以開啟多少個(gè)?是否有限制呢?
func testRoutine() {
var wg sync.WaitGroup
for i := 0; i < math.MaxInt32; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
fmt.Printf("并發(fā)數(shù)量:%d/n", i)
time.Sleep(time.Second)
}(i)
}
wg.Wait()
}
以上代碼開啟了 math.MaxInt32個(gè)協(xié)程的并發(fā),執(zhí)行后可以看到結(jié)果直接 panic:“panic: too many concurrent operations on a single file or socket (max 1048575)”。整個(gè)并發(fā)操作超出了系統(tǒng)最大值。
控制協(xié)程數(shù)量
sync 同步機(jī)制
使用 sync.WaitGroup 啟動(dòng)指定數(shù)量的協(xié)程 goroutine。
func testRoutine() {
var wg = sync.WaitGroup{}
taskCount := 5 // 指定并發(fā)數(shù)量
for i := 0; i < taskCount; i++ {
wg.Add(1)
go func(i int) {
fmt.Println("go func ", i)
wg.Done()
}(i)
}
wg.Wait()
}
如果 taskcount 設(shè)置的很大超出了限制的,則其還是沒(méi)有控制到并發(fā)數(shù)量。可以優(yōu)化下設(shè)計(jì),類似池的設(shè)計(jì)思想,通過(guò)允許最大連接數(shù)控制量,當(dāng)超出了數(shù)量就需要等待釋放,有空閑的連接的時(shí)候才可以繼續(xù)執(zhí)行。
func testRoutine() {
task_chan := make(chan bool, 3) //100 為 channel長(zhǎng)度
wg := sync.WaitGroup{}
defer close(task_chan)
for i := 0; i < math.MaxInt; i++ {
wg.Add(1)
fmt.Println("go func ", i)
task_chan <- true
go func() {
<-task_chan
defer wg.Done()
}()
}
wg.Wait()
}
- 創(chuàng)建緩沖區(qū)大小為 3 的 channel,在沒(méi)有被接收的情況下,至多發(fā)送 3 個(gè)消息則被阻塞。通過(guò) channel 控制每次并發(fā)的數(shù)量。
- 開啟協(xié)程前,設(shè)置 task_chan <- true,若緩存區(qū)滿了則阻塞
- 協(xié)程任務(wù)執(zhí)行完成后就釋放緩沖區(qū)
- 等待所有的并發(fā)都處理結(jié)束后則函數(shù)結(jié)束。其實(shí)可以不使用 sync.WaitGroup。因使用 channel 控制并發(fā)處理的任務(wù)數(shù)量可以不用使用等待并發(fā)處理結(jié)束。
-
Channel
+關(guān)注
關(guān)注
0文章
31瀏覽量
12086 -
線程
+關(guān)注
關(guān)注
0文章
507瀏覽量
20080 -
go語(yǔ)言
+關(guān)注
關(guān)注
1文章
158瀏覽量
9289
原文標(biāo)題:使用 channel 控制并發(fā)數(shù)量
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
談?wù)?b class='flag-5'>協(xié)程的那些事兒

協(xié)程和線程有什么區(qū)別
Python中的多核CPU共享數(shù)據(jù)之協(xié)程詳解

關(guān)于C++ 20協(xié)程最全面詳解

Python后端項(xiàng)目的協(xié)程是什么
Python協(xié)程與JavaScript協(xié)程的對(duì)比及經(jīng)驗(yàn)技巧
通過(guò)例子由淺入深的理解yield協(xié)程
詳解Linux線程、線程與異步編程、協(xié)程與異步
協(xié)程的概念及協(xié)程的掛起函數(shù)介紹
Kotlin協(xié)程實(shí)戰(zhàn)進(jìn)階之筑基篇3
FreeRTOS任務(wù)與協(xié)程介紹
協(xié)程的作用、結(jié)構(gòu)及原理

C/C++協(xié)程編程的相關(guān)概念和技巧
協(xié)程的實(shí)現(xiàn)與原理
Linux線程、線程與異步編程、協(xié)程與異步介紹

評(píng)論