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()を使用して全てのタスクが完了するまで待ちます。

これにより、同時実行数を制御しながらも、すべてのタスクが確実に完了する。

bannerAds