Go言語で並列処理を制御する方法
Go言語では、goroutineとchannelを利用して、並列処理タスク数を制御できます。
まず、goroutineを使ってタスクを並行実行できます。例えば、タスク(それぞれのタスクは匿名関数)のリストがあると、以下のように並行実行できます。
tasks := []func(){}
// 填充任务列表...
concurrency := 10 // 并发数量
semaphore := make(chan struct{}, concurrency)
var wg sync.WaitGroup
for _, task := range tasks {
wg.Add(1)
go func(task func()) {
defer wg.Done()
semaphore <- struct{}{} // acquire semaphore
task()
<-semaphore // release semaphore
}(task)
}
wg.Wait()
コードでは、goroutineの実行可能な最大数を制御するために、バッファ付きチャネルをセマフォとして使用します。まずバッファサイズが同時実行できるgoroutine数のチャネルを作成します。その後、semaphore <- struct{}{}を使用して、実行可能なタスクを示すセマフォを取得します。タスクが完了すると、<-semaphoreを使用してセマフォを解放し、タスクが完了したことを示します。
さらに、sync.WaitGroupを使用して全てのタスクが実行されるまで待ちます。forループの中で、wg.Add(1)を使用してタスクの数を追加し、各goroutine内でwg.Done()を使用してタスクの実行完了を表します。最後に、wg.Wait()を使用して全てのタスクが完了するまで待ちます。
これにより、同時実行数を制御しながらも、すべてのタスクが確実に完了する。