同時ゴルーチン数の制御
多数のゴルーチンを同時に実行すると、適切に設計されたプログラムのパフォーマンスを向上させることができます。ただし、特定のシナリオでは、同時に実行するゴルーチンの数を制限する必要があります。この記事では、任意の時点で実行されるゴルーチンの数を管理する方法について説明します。
制限付き並列処理
Go 同時実行で説明されている「制限付き並列処理」パターンパターンの記事では、同時ゴルーチンの数を制限するためのソリューションが提供されています。このパターンでは、同時に実行できるゴルーチンの数を制御するために容量が制限されたチャネルを利用します。
実装例
次の例を考えてみましょう。多数のタスクを処理するために最大 10 個の同時ゴルーチン:
package main import "fmt" func main() { maxGoroutines := 10 guard := make(chan struct{}, maxGoroutines) // Capacity of the channel limits concurrent goroutines for i := 0; i < 30; i++ { guard <- struct{}{} // Blocking operation to prevent exceeding the limit go func(n int) { worker(n) <-guard // Release the guard when the worker completes }(i) } } func worker(i int) { fmt.Println("doing work on", i) }
Inこの実装では、ガード チャネルが制限要因として機能します。同時ゴルーチンの数がチャネルの最大容量 (10) に達すると、ガード チャネルは新しいゴルーチンの開始をブロックします。実行中のゴルーチンが完了すると、チャネルから受信することでガードが解除され、新しいゴルーチンの実行が可能になります。
結論
「有界並列処理」パターンを利用する容量が限られたチャネルでは、同時ゴルーチンの数を制御して、望ましい最大値が一貫して維持されるようにすることができます。このアプローチは、Go プログラムの並列処理を管理するための構造化された効率的な方法を提供します。
以上がGo で同時ゴルーチンの数を制御するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。