Go言語のWaitGroupとGoroutineプールの効果的な組み合わせ

Golangでは、sync.WaitGroupとgoroutineプールの活用によって効率的な並行処理を実現できます。

まず、sync.WaitGroupオブジェクトを作成し、そのカウンタをワーカープールのサイズに初期化します。カウンタは、実行中のワーカーの数を表します。次に、タスクをタスクキューに追加します。

次に、固定サイズのゴルーチン・プールを作成する。これは、Go言語のchanを使用して実装できます。ループを使用してゴルーチンを起動し、各ゴルーチンはタスクキューからタスクを取得して実行します。ゴルーチンがタスクの実行を完了した後は、カウンタを1減らします。

最後に、全タスクがタスクキューに追加されたら、Waitメソッドを呼び出して全てのコルーチンが完了するまで待って、以降の操作へと進みます。

以下にサンプルコードを示します。

package main
import (
"fmt"
"sync"
)
func main() {
// 创建一个WaitGroup对象
var wg sync.WaitGroup
// 初始化协程池的大小
poolSize := 10
// 初始化任务队列
taskQueue := make(chan int)
// 启动协程池
for i := 0; i < poolSize; i++ {
go func() {
// 从任务队列中获取任务并执行
for task := range taskQueue {
// 执行任务
fmt.Println("Processing task", task)
// 模拟任务执行时间
// time.Sleep(time.Second)
// 指示任务已完成
wg.Done()
}
}()
}
// 添加任务到任务队列
for i := 0; i < 100; i++ {
// 增加计数器
wg.Add(1)
// 将任务添加到任务队列中
taskQueue <- i
}
// 关闭任务队列
close(taskQueue)
// 等待所有协程执行完毕
wg.Wait()
fmt.Println("All tasks completed")
}

上の例では、10サイズのcoroutineプールを作成して、100個のtaskをtaskキューに追加しました。各taskはメッセージを出力し、time.Sleepを使用してtaskの実行時間をシミュレートしました。最後に、Waitメソッドを使用してすべてのcoroutineの実行を待って、完了メッセージを出力しています。

Sync.WaitGroupとgoroutineプールの利用により効率的な並行処理を実現し、プログラムパフォーマンスの向上を図る。

bannerAds