golang の最大の同時実行数を制御する方法
Goではgoroutine数制御により最大同時実行数を制限できます。
よく使われる方法の一つとして、バッファリングされたチャネルを使用して同時実行を制限する方法があります。固定のバッファサイズのチャネルを作成することで、同時に実行するゴルーチン数を制限できます。ゴルーチンは起動するときに、まずチャネルから使用可能なトークンを取得する必要があります。使用可能なトークンがない場合、ゴルーチンはトークンが使用可能になるまでブロックされます。
サンプルコードを以下に示します。
package main
import "fmt"
func worker(id int, tokens chan struct{}) {
fmt.Printf("Worker %d started\n", id)
<-tokens // 获取一个令牌
// 执行工作任务
fmt.Printf("Worker %d is working\n", id)
tokens <- struct{}{} // 释放令牌
fmt.Printf("Worker %d finished\n", id)
}
func main() {
concurrency := 3 // 最大并发数
tokens := make(chan struct{}, concurrency) // 创建带有固定缓冲大小的channel
// 启动多个goroutine
for i := 0; i < 10; i++ {
tokens <- struct{}{} // 添加令牌到channel
go worker(i, tokens)
}
// 等待所有goroutine完成
for i := 0; i < concurrency; i++ {
tokens <- struct{}{}
}
}
上記の例では、固定のバッファサイズを持つチャネル`tokens`を定義しました。`main`関数では、10個のgoroutineを起動し、各goroutineは`tokens`チャネルからトークンを取得し、その後で作業タスクを実行します。タスクが完了すると、goroutineはトークンをチャネルに戻し、他のgoroutineが取得してタスクを実行できるようにします。
concurrency変数の値を調整することで、同時に実行できる最大並行数を制御できます。上記の例では最大並行数を3に設定しています。つまり、同時に実行できるgoroutineは最大で3つということです。