同時実行ゴルーチンの固定数の維持
Go では、同時実行ゴルーチンの数の制御が重要となるシナリオに遭遇することがあります。多くの場合、チュートリアルではゴルーチンが完了するのを待つことに重点が置かれていますが、常に特定の数のアクティブなゴルーチンを達成するには別の課題が生じます。
次の状況を考えてみましょう。処理するタスクが数十万件あるとします。各タスクの処理には独自の goroutine が必要ですが、システム リソースが同時に処理できる goroutine は最大 20 個までです。常に 20 個のゴルーチンが実行されていることを確認し、既存のゴルーチンが完了するたびに新しいゴルーチンを起動する必要があります。
制限付き並列処理
これを実現するには、Go 同時実行パターンを使用します。この記事では、「有界並列処理」と呼ばれるパターンの使用を提案しています。これには、同時ワーカーの数を制限するためのガードとして空の構造体のチャネルを使用することが含まれます。
実装
このパターンを実装する方法を示す例を次に示します。
package main import ( "fmt" "sync" ) func main() { const maxGoroutines = 20 // Create a channel of empty structs to control worker count guard := make(chan struct{}, maxGoroutines) var wg sync.WaitGroup // Launch workers for i := 0; i < 30; i++ { wg.Add(1) guard <- struct{}{} // Blocks if guard channel is filled go func(n int) { defer wg.Done() worker(n) <-guard // Release slot in guard channel }(i) } wg.Wait() } func worker(i int) { fmt.Println("doing work on", i) }
この例では、ガード チャネルがトークン バケットとして使用されます。同時に実行できるゴルーチンの最大数は、チャネルの容量によって制限されます (この場合は 20)。各ゴルーチンは、作業を開始する前にチャネルから「トークン」(空の構造体)を取得します。 goroutine が終了すると、そのトークンがチャネルに解放され、別の goroutine がそのトークンを取得できるようになります。チャネル内のトークンの数を制御することで、同時実行ゴルーチンの数を効果的に制御できます。
以上がGo で同時実行ゴルーチンの数を一定に維持するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。