Go_Worker Pool

date
Dec 1, 2021
slug
workerpool
status
Published
tags
Golang
summary
Fan-out Fan-in
type
Post

GolangにおけるFan-out Fan-inパターンとワーカープール

 

はじめに

Golangは並行処理を容易に実装できる言語として知られています。その中でも、Fan-out Fan-inパターンとワーカープールは、並行処理の効率を向上させるためによく使用される手法です。

Fan-out Fan-inパターンとは

Fan-out Fan-inパターンは、タスクを複数のワーカーに分散させて並行処理する(Fan-out)ことで処理速度を向上させ、その後結果を一つにまとめる(Fan-in)ことを指します。

ワーカープールとは

ワーカープールは、一定数のワーカーを事前に起動し、タスクを処理するための手法です。これにより、ワーカーの数を制御し、システムリソースを効率的に使用することができます。

Golangにおける実装例

以下は、GolangでFan-out Fan-inパターンとワーカープールを組み合わせて実装した例です。
package main import ( "fmt" "sync" "time" ) const numWorkers = 3 // ワーカーの数を制限 func worker(id int, jobs <-chan int, results chan<- int, wg *sync.WaitGroup) { defer wg.Done() for job := range jobs { fmt.Printf("Worker %d started job %d\n", id, job) time.Sleep(time.Second) // 仮の処理時間 fmt.Printf("Worker %d finished job %d\n", id, job) results <- job * 2 // 結果を返す } } func main() { jobs := make(chan int, 100) results := make(chan int, 100) var wg sync.WaitGroup // ワーカープールを作成(Fan-out) wg.Add(numWorkers) for w := 1; w <= numWorkers; w++ { go worker(w, jobs, results, &wg) } // ジョブを追加 for j := 1; j <= 9; j++ { jobs <- j } close(jobs) // ワーカーが完了するのを待つ wg.Wait() close(results) // 結果を収集(Fan-in) for result := range results { fmt.Println("Result:", result) } }
この例では、numWorkers定数を使用してワーカーの数を制限し、sync.WaitGroupを使用してすべてのワーカーが完了するのを待っています。これにより、適切な数のワーカーを使用して効率的にタスクを処理することができます。

利点と注意点

Fan-out Fan-inパターンとワーカープールを組み合わせることで、並行処理の効率を大幅に向上させることができます。しかし、ワーカーの数やタスクの分割方法を適切に管理することが重要です。また、結果の収集(Fan-in)を適切に行うことも重要です。

まとめ

GolangのFan-out Fan-inパターンとワーカープールは、並行処理の効率を向上させる強力なツールです。適切に使用すれば、プログラムのパフォーマンスを大幅に改善することができます。しかし、ワーカーの数や結果の収集方法を適切に管理することが重要です。
If you have any questions, please contact me.