Go でのゴルーチンのスレッド化: 定数を同時に実行する
Go の同時実行の領域では、指定された数のゴルーチンの完了を待つための大量の資料が提供されます。ただし、明確な課題が存在します。それは、事前に定義された数のゴルーチンを継続的に実行し、1 つのゴルーチンが開始され、別のゴルーチンが終了することを保証することです。
MySQL から取得したデータの処理など、大量のタスクを含むシナリオを考えてみましょう。データベース。単純なアプローチでは、膨大な数の並列ゴルーチンが開始され、数十万のタスクが同時に実行される可能性があります。対照的に、望ましい動作では、同時に実行するゴルーチンを固定数 (たとえば 20) に制限します。
この制御された同時実行パターンは、「制限された並列処理」として知られています。 Go でこのパターンを実装するには、空の構造体のチャネルをセマフォとして使用する必要があり、同時ワーカー ゴルーチンの最大数を決定します。以下に図を示します。
package main import "fmt" func main() { maxGoroutines := 10 guard := make(chan struct{}, maxGoroutines) for i := 0; i < 30; i++ { guard <- struct{}{} // blocks if guard channel is full go func(n int) { worker(n) <-guard // unlocks a slot in guard }(i) } } func worker(i int) { fmt.Println("doing work on", i) }
この実装では、指定された数を超えるゴルーチンが同時に実行されないようにします。その結果、ワーカー goroutine が終了すると、新しい goroutine がすぐに起動され、必要な同時実行レベルが維持されます。
「Go 同時実行パターン」の記事では、「制限された並列処理」セクションでこの概念をさらに詳しく説明し、より詳細な情報を提供します。この重要な同時実行技術についての洞察。
以上がGo で同時に実行するゴルーチンの数を一定に維持するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。