在Go語言中,可以使用sync.WaitGroup
和chan
來限制最大并發數。
sync.WaitGroup
:sync.WaitGroup
是一個計數器,用來等待一組goroutine完成任務。可以在每個goroutine開始執行前調用Add()
方法增加計數器,然后在goroutine執行結束時調用Done()
方法減少計數器,最后可以調用Wait()
方法等待所有的goroutine完成。以下是一個使用sync.WaitGroup
限制最大并發數的示例代碼:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
// 設置最大并發數為3
maxConcurrency := 3
// 創建一個等待組
var wg sync.WaitGroup
// 創建一個通道用于控制最大并發數
sem := make(chan struct{}, maxConcurrency)
// 創建10個任務
for i := 0; i < 10; i++ {
wg.Add(1)
// 將任務添加到通道中
sem <- struct{}{}
go func(i int) {
// 執行任務
fmt.Println("Task", i, "start")
time.Sleep(time.Second)
fmt.Println("Task", i, "done")
// 任務完成后從通道中移除
<-sem
// 完成任務
wg.Done()
}(i)
}
// 等待所有任務完成
wg.Wait()
}
chan
:chan
是Go語言中的通道,可以用來進行goroutine之間的通信。通過創建一個指定緩沖大小的通道,可以限制最大并發數。以下是一個使用chan
限制最大并發數的示例代碼:
package main
import (
"fmt"
"time"
)
func main() {
// 設置最大并發數為3
maxConcurrency := 3
// 創建一個通道用于控制最大并發數
sem := make(chan struct{}, maxConcurrency)
// 創建10個任務
for i := 0; i < 10; i++ {
// 將任務添加到通道中
sem <- struct{}{}
go func(i int) {
// 執行任務
fmt.Println("Task", i, "start")
time.Sleep(time.Second)
fmt.Println("Task", i, "done")
// 任務完成后從通道中移除
<-sem
}(i)
}
// 等待所有任務完成
for i := 0; i < maxConcurrency; i++ {
sem <- struct{}{}
}
}
這樣可以確保同一時間最多同時執行maxConcurrency個goroutine。