Goの非同期処理と強力なWaitGroup

Go言語には、Go WaitGroupという仕組みがあり、并行操作を同期させることができます。WaitGroupはカウンタで、一連のgoroutineがタスクを完了するのを待つのに利用されます。

WaitGroupを使うと、複数の処理が非同期処理中、すべての処理が完了するまで待機することが可能になります。以下では、非同期処理とそのWaitGroupの融合方法を示します。

  1. まず、WaitGroupオブジェクトを作成し、カウンターの初期値をタスク数に設定します。
var wg sync.WaitGroup
wg.Add(numTasks)
  1. 各タスクを処理する際には Goroutine を使用してタスクを非同期実行し、タスクが完了したら Done メソッドを呼び出してカウンタの値を減らす。
for _, task := range tasks {
go func(t Task) {
// 处理任务 t
// ...
// 任务完成时调用Done方法
wg.Done()
}(task)
}
  1. すべてのタスクが起動した後に、Waitメソッドを使用して、すべてのタスクが完了するのを待ちます。
wg.Wait()

そうすることで複数のタスクを同時に処理でき、すべてのタスクが終了したら、後続の操作に移ることができます。

完全なサンプルコードは以下の通りです:

package main
import (
"fmt"
"sync"
"time"
)
type Task struct {
id int
}
func main() {
numTasks := 10
tasks := make([]Task, numTasks)
var wg sync.WaitGroup
wg.Add(numTasks)
for i := 0; i < numTasks; i++ {
tasks[i] = Task{id: i}
go func(t Task) {
// 模拟处理任务
time.Sleep(1 * time.Second)
fmt.Printf("Task %d done\n", t.id)
// 任务完成时调用Done方法
wg.Done()
}(tasks[i])
}
// 等待所有任务完成
wg.Wait()
fmt.Println("All tasks done")
}

結果を出力します。

Task 1 done
Task 2 done
Task 5 done
Task 8 done
Task 4 done
Task 9 done
Task 6 done
Task 7 done
Task 3 done
Task 0 done
All tasks done

非同期処理とWaitGroupを巧みに組み合わせることで、並行タスクを効率的に処理し、すべてのタスクが完了したら後の処理に進めます。

bannerAds