Goで並列処理数を制御する方法を教えてください
Goでは、goroutineとチャネルを組み合わせて並行処理数を制御できます。一般的な方法を以下に示します。
- goroutine と WaitGroup を使う: 並行処理数を制御するには、sync パッケージの WaitGroup を利用できます。WaitGroup オブジェクトを作成し、各 goroutine 内で Add メソッドを呼び出してカウンタを増やし、タスクの実行後に Done メソッドを呼び出してカウンタを減らします。最後に、Wait メソッドを使用して、 カウンタがゼロになるまでメイン goroutine をブロックできます。
import (
"sync"
)
func main() {
var wg sync.WaitGroup
maxConcurrency := 10 // 并发数量
for i := 0; i < maxConcurrency; i++ {
wg.Add(1)
go func() {
defer wg.Done()
// 执行任务
}()
}
wg.Wait()
}
- バッファ付きチャネルを利用して同時実行数を制御する: 指定したバッファサイズのチャネルを作成し、各ゴルーチン内でチャネルへタスクを送信します。チャネルのバッファサイズは同時実行数を制限します。
func main() {
maxConcurrency := 10 // 并发数量
taskCh := make(chan int, maxConcurrency)
for i := 0; i < maxConcurrency; i++ {
go func() {
for task := range taskCh {
// 执行任务
}
}()
}
// 发送任务到channel
for i := 0; i < 100; i++ {
taskCh <- i
}
close(taskCh)
}
これら手法は全て並行処理数制御の効率を高めます。実際の状況に応じて適切な手法を選択できます。