在Go語言中,可以使用goroutine和channel來控制并發(fā)數(shù)量。
首先,可以使用goroutine來并發(fā)執(zhí)行任務。例如,有一個任務列表,每個任務是一個匿名函數(shù),可以使用以下代碼并發(fā)執(zhí)行這些任務:
tasks := []func(){}
// 填充任務列表...
concurrency := 10 // 并發(fā)數(shù)量
semaphore := make(chan struct{}, concurrency)
var wg sync.WaitGroup
for _, task := range tasks {
wg.Add(1)
go func(task func()) {
defer wg.Done()
semaphore <- struct{}{} // acquire semaphore
task()
<-semaphore // release semaphore
}(task)
}
wg.Wait()
在上面的代碼中,使用了一個帶緩沖的channel作為信號量(semaphore),用于控制并發(fā)數(shù)量。首先創(chuàng)建一個帶緩沖大小的channel,大小為并發(fā)數(shù)量,用于限制并發(fā)的goroutine數(shù)量。然后使用semaphore <- struct{}{}
來獲取信號量,表示可以執(zhí)行任務。任務執(zhí)行完后,使用<-semaphore
釋放信號量,表示任務執(zhí)行完成。
另外,還可以使用sync.WaitGroup
來等待所有任務執(zhí)行完成。在for循環(huán)中,使用wg.Add(1)
來添加任務數(shù)量,然后在每個goroutine中使用wg.Done()
表示任務執(zhí)行完成。最后使用wg.Wait()
等待所有任務完成。
通過以上方式,可以控制并發(fā)數(shù)量,同時確保所有任務都被執(zhí)行完畢。