在 Go 語言中,使用帶緩沖的通道(buffered channels)可以有效地控制并發(fā)數(shù)。帶緩沖的通道可以讓你限制同時運行的 goroutine 數(shù)量,從而避免過度并發(fā)導(dǎo)致的資源耗盡問題。以下是一個使用帶緩沖通道控制并發(fā)數(shù)的示例:
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
// 請求一個資源
sem <- struct{}{}
// 模擬耗時操作
fmt.Printf("Worker %d started\n", id)
time.Sleep(2 * time.Second)
fmt.Printf("Worker %d finished\n", id)
// 釋放一個資源
<-sem
}
func main() {
// 定義最大并發(fā)數(shù)
const maxConcurrency = 3
// 創(chuàng)建帶緩沖的通道,用于限制并發(fā)數(shù)
sem := make(chan struct{}, maxConcurrency)
// 使用 sync.WaitGroup 等待所有 goroutine 完成
var wg sync.WaitGroup
// 啟動 10 個 worker
for i := 1; i <= 10; i++ {
wg.Add(1)
go worker(i, sem, &wg)
}
// 等待所有 worker 完成
wg.Wait()
}
在這個示例中,我們創(chuàng)建了一個帶緩沖的通道 sem,并將其緩沖大小設(shè)置為最大并發(fā)數(shù)。我們使用了一個 sync.WaitGroup 實例來等待所有 goroutine 完成。當(dāng) worker 開始執(zhí)行時,它會向通道發(fā)送一個空結(jié)構(gòu)體,從而請求一個資源。如果通道已滿,worker 將會阻塞,直到有可用資源。
當(dāng) worker 完成任務(wù)后,它會從通道接收一個空結(jié)構(gòu)體,從而釋放一個資源。這樣,我們就可以通過調(diào)整 maxConcurrency 的值來控制并發(fā)數(shù)。