Golang および Go WaitGroup での同時実行制御
Golang では、Goroutine を使用して同時実行タスクを実装できます。ただし、場合によっては、過剰なリソース消費や同時実行競合の問題を回避するために、同時実行数を制御する必要があります。 Golang には同時実行制御を実現するためのメソッドがいくつか用意されており、最も一般的に使用されるメソッドは Go WaitGroup を使用することです。
Go WaitGroup は、ゴルーチンのグループが実行を完了するのを待つために使用されるカウント セマフォです。ゴルーチンのグループを開始するとき、WaitGroup を使用してこれらのゴルーチンのステータスを追跡し、すべてのゴルーチンが完了した後に次のステップを実行できます。
以下では、特定のコード例を使用して、Golang での同時実行制御と Go WaitGroup の使用を示します。
package main import ( "fmt" "sync" "time" ) func main() { numWorkers := 5 var wg sync.WaitGroup for i := 0; i < numWorkers; i++ { wg.Add(1) // 每启动一个goroutine,等待组加1 go worker(i, &wg) } wg.Wait() // 等待所有goroutine完成 fmt.Println("All workers have finished") } func worker(id int, wg *sync.WaitGroup) { defer wg.Done() // goroutine执行完毕,等待组减1 fmt.Printf("Worker %d started ", id) time.Sleep(time.Second) // 模拟耗时操作 fmt.Printf("Worker %d finished ", id) }
この例には 5 つのゴルーチンがあり、各実行のタスクはワーカー関数を呼び出すことです。まず、WaitGroup 変数 wg を定義し、main 関数で 5 つのゴルーチンを開始しました。各ゴルーチンはワーカー関数を呼び出し、wg にポインタを渡すことで WaitGroup を操作します。
ワーカー関数では、 defer wg.Done() を使用して、ゴルーチンの実行完了後に待機グループの数を減らします。これは、各ゴルーチンが Done() 関数を呼び出して、完了時に WaitGroup に通知することを意味します。次に、各ワーカー関数に時間のかかる操作をシミュレートして追加し、同時実行の効果を観察しました。
main 関数では、wg.Wait() を呼び出して、すべてのゴルーチンが完了するのを待ちます。これにより、すべての goroutine の実行が終了した後、WaitGroup カウントが 0 に達するまで main 関数がブロックされます。
上記のコードを実行すると、次のような出力が表示されます。
Worker 0 started Worker 1 started Worker 2 started Worker 3 started Worker 4 started Worker 3 finished Worker 2 finished Worker 0 finished Worker 1 finished Worker 4 finished All workers have finished
出力からわかるように、すべてのゴルーチンが同時に開始および実行され、完了後に通知されます。メイン機能。
Go WaitGroup を使用すると、同時実行数を簡単に制御し、すべてのゴルーチンが完了した後に後続の操作を実行できます。これは、大規模な同時タスクを処理したり、リソース消費を制限したりする場合に非常に役立ちます。
要約すると、Golang の同時実行制御と Go WaitGroup は同時プログラミングを実装するための重要なツールです。 WaitGroup を使用してゴルーチンのグループの実行を追跡および制御し、同時操作の正確さと安定性を確保できます。これにより、マルチコア プロセッサとリソースを有効に活用し、プログラムの実行効率を向上させることができます。
以上がGolang と Go WaitGroup の同時実行制御の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。