Golang 同時プログラミング: Go WaitGroup を使用したタスク スケジューラの実装
WaitGroup は、未完了のタスクの数を記録するために内部的にカウンターを維持します。 Add メソッドが呼び出されると、カウンターは指定された値だけインクリメントされます。Done メソッドが呼び出されると、カウンターは 1 ずつデクリメントされます。Wait メソッドが呼び出されると、カウンターが 0 より大きい場合、現在のゴルーチンは次のようになります。カウンタがゼロに戻るまでブロックされます。
package main import ( "fmt" "sync" "time" ) func worker(id int, wg *sync.WaitGroup) { defer wg.Done() fmt.Printf("Worker %d starting ", id) time.Sleep(time.Second) fmt.Printf("Worker %d done ", id) } func main() { var wg sync.WaitGroup for i := 1; i <= 5; i++ { wg.Add(1) go worker(i, &wg) } wg.Wait() fmt.Println("All workers done") }
この例では、for ループを使用して、 5 つのワーカー ゴルーチンを開始し、wg.Add(1) を呼び出してタスクの数を WaitGroup に追加します。ワーカー関数では、 defer キーワードを使用して、関数が戻ってカウンター値をデクリメントする前に wg.Done() が呼び出されるようにします。最後に、wg.Wait() を使用して、すべてのタスクが完了するのを待ちます。
Worker 1 starting Worker 2 starting Worker 3 starting Worker 4 starting Worker 5 starting Worker 3 done Worker 1 done Worker 2 done Worker 5 done Worker 4 done All workers done
すべてのワーカー ゴルーチンが同時に実行されていることがわかります。 goroutine のスケジューリングは Go ランタイムによって実行されるため、出力の順序は必ずしも起動順序になるわけではありません。
この記事の概要とサンプル コードを通じて、Golang の WaitGroup を使用してタスク スケジューラを実装する方法についてより深く理解できたと思います。この記事が、Golang での並行プログラミングの学習と使用に役立つことを願っています。
以上がGolang 同時プログラミング: Go WaitGroup を使用してタスク スケジューラを実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。