Goルーチン数を制限する方法
Go言語では、セマフォを使用してゴルーチンの数を制限できます。セマフォはマルチスレッド同期用のプリミティブで、共有リソースへのアクセスを制御するために使用します。
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 を作成します。各コルーチンは、動作の開始前に、セマフォから 1 つの許可を取得します。動作が完了したら、その許可を解除して、他のコルーチンが取得できるようにします。これにより、同時に実行されるコルーチンの数を numWorkers に制限できます。
セマフォチャネルのバッファサイズは、同時に実行されるゴルーチン数を決定することに注意してください。セマフォを作成するときは、実際の要件に基づいて適切なバッファサイズを選択できます。