在Go語言中,可以使用信號量(Semaphore)來限制協程的數量。信號量是一種多線程同步的原語,用于控制對共享資源的訪問。
可以使用Go語言中的sync
包中的Semaphore
來實現信號量。sync
包中提供了一個WaitGroup
類型,可以用于等待一組協程完成。
下面是一個示例代碼,演示如何使用信號量限制協程數量:
package main
import (
"fmt"
"sync"
)
func worker(id int, semaphore chan struct{}, wg *sync.WaitGroup) {
// 從信號量中獲取一個許可
semaphore <- struct{}{}
// 執行工作
fmt.Println("Worker", id, "start")
// 模擬工作
for i := 0; i < 5; i++ {
fmt.Println("Worker", id, "working", i)
}
fmt.Println("Worker", id, "done")
// 釋放許可,使其他協程可以獲取
<-semaphore
// 通知WaitGroup,當前協程已完成
wg.Done()
}
func main() {
const numWorkers = 3
semaphore := make(chan struct{}, numWorkers) // 創建大小為numWorkers的信號量
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go worker(i, semaphore, &wg)
}
wg.Wait() // 等待所有協程完成
}
在上述代碼中,我們創建了一個大小為numWorkers
的信號量semaphore
,用于控制協程的數量。每個協程在開始執行工作前,先從信號量獲取一個許可,當工作完成后,釋放許可,使其他協程可以獲取。這樣就可以限制同時執行的協程數量為numWorkers
。
需要注意的是,semaphore
通道的緩沖大小決定了同時執行的協程數量。在創建信號量時,可以根據實際需求選擇合適的緩沖大小。