大規模タスク処理:GoのWaitGroupとgoroutineプールを利用する

大規模タスク処理において、Go言語を利用する場合、WaitGroupとゴルーチンプールを組み合わせて利用することで、並列実行の効率を上げることが可能です。

最初に、必要なパッケージをインポートします。

import (
"sync"
"time"
)

続いて、タスクの構造体を定義します。この構造体には、タスクに関連する情報とタスクを実行する方法が含まれます。

type Task struct {
ID   int
Data interface{}
}
func (t *Task) Do() {
// 执行任务的具体逻辑
time.Sleep(time.Second)
fmt.Printf("Task %d done\n", t.ID)
}

それから、非同期的に実行されるタスクを管理するために、コルーチンプールを作成できます。

type Pool struct {
workers   int
taskQueue chan *Task
wg        sync.WaitGroup
}
func NewPool(workers int) *Pool {
return &Pool{
workers:   workers,
taskQueue: make(chan *Task),
}
}

コルーチンプールでは、コルーチンプールで動作するメソッドを定義できます。

func (p *Pool) Run() {
for i := 0; i < p.workers; i++ {
go p.worker()
}
}
func (p *Pool) worker() {
for task := range p.taskQueue {
task.Do()
p.wg.Done()
}
}

次に、タスクを作成してコルーチン・プールのタスクキューに追加します。

func main() {
pool := NewPool(3)
pool.Run()
for i := 0; i < 10; i++ {
task := &Task{
ID:   i,
Data: "some data",
}
pool.wg.Add(1)
pool.taskQueue <- task
}
pool.wg.Wait()
}

上記サンプルでは、ワーカーゴルーチンを3つ設定したゴルーチンプールを作成しました。そして、タスクを10個作成し、それらをゴルーチンプールのタスクキューに追加しました。最後に、WaitGroupを使用して、全てのタスクが完了するまで待機しました。

WaitGroupとゴルーチンプールを使用することで、大規模タスクの並行実行を簡単に管理し、プログラムのパフォーマンスと効率を向上させることができる。

bannerAds