Golang および Go WaitGroup でのデータの同時実行処理
はじめに:
現代のソフトウェア開発において、データの同時実行処理は非常に重要なテクノロジです。大量のデータを処理する場合、同時実行技術を使用すると、プログラムのパフォーマンスと応答時間を大幅に向上させることができます。 Golang は同時実行に適したプログラミング言語として、同時データ処理を実装するためのさまざまな方法を提供します。最も一般的に使用される方法は Go WaitGroup を使用することです。この記事では、Golang でのデータの同時処理処理と、Go WaitGroup を使用して同時タスクを管理する方法を詳しく紹介します。
package main import ( "fmt" "time" ) func main() { go printNumbers() go printLetters() time.Sleep(2 * time.Second) } func printNumbers() { for i := 1; i <= 5; i++ { fmt.Println(i) time.Sleep(500 * time.Millisecond) } } func printLetters() { for i := 'a'; i <= 'e'; i++ { fmt.Printf("%c ", i) time.Sleep(500 * time.Millisecond) } }
上記のコードでは、printNumbers
関数と printLetters
関数を同時に実行する 2 つのゴルーチンを作成しました。 printNumbers
関数は 1 ~ 5 の数字を出力し、printLetters
関数は小文字の a ~ e を出力します。 time.Sleep
を使用して、メイン プログラムを十分な時間待機させて、2 つのゴルーチンが完了した後にプログラムが終了するようにします。
time.Sleep
を通じて goroutine の完了を待つのも 1 つの方法ですが、この方法は実際の開発では信頼性も柔軟性もありません。 Golang は、Goroutine の完了ステータスをより適切に管理するために sync.WaitGroup
を提供します。 WaitGroup
は、ゴルーチンのグループの完了を待つために使用されるカウント セマフォです。以下は、WaitGroup
を使用したサンプル コードです。 package main import ( "fmt" "sync" "time" ) func main() { var wg sync.WaitGroup wg.Add(2) // 添加两个任务 go printNumbers(&wg) go printLetters(&wg) wg.Wait() // 等待所有任务完成 } func printNumbers(wg *sync.WaitGroup) { defer wg.Done() // 减少计数器 for i := 1; i <= 5; i++ { fmt.Println(i) time.Sleep(500 * time.Millisecond) } } func printLetters(wg *sync.WaitGroup) { defer wg.Done() // 减少计数器 for i := 'a'; i <= 'e'; i++ { fmt.Printf("%c ", i) time.Sleep(500 * time.Millisecond) } }
上記のコードでは、まず WaitGroup
オブジェクト wg
を作成します。そして、wg.Add(2)
メソッドを通じて待機するタスクが 2 つあることを WaitGroup
に通知します。次に、printNumbers
関数と printLetters
関数の wg.Done()
メソッドをそれぞれ呼び出して、カウンターをデクリメントします。最後に、wg.Wait()
メソッドを呼び出すことにより、プログラムはすべてのタスクが完了するまでブロックされ、その後、次のコードの実行を続けます。
WaitGroup
では、同時実行数の制限、タイムアウト制御などの高度な使用法も提供します。以下は、同時タスク制限に WaitGroup
を使用するサンプル コードです。 package main import ( "fmt" "sync" "time" ) func main() { var ( wg sync.WaitGroup maxCon = 2 // 最大并发数 tasks = 10 // 总任务数 ) // 创建一个带有最大并发数限制的通道 semaphore := make(chan struct{}, maxCon) for i := 0; i < tasks; i++ { wg.Add(1) go process(i, &wg, semaphore) } wg.Wait() } func process(id int, wg *sync.WaitGroup, semaphore chan struct{}) { defer wg.Done() semaphore <- struct{}{} // 每个任务开始前获取信号量 defer func() { <-semaphore // 每个任务结束时释放信号量 }() fmt.Printf("Task %d start ", id) time.Sleep(500 * time.Millisecond) fmt.Printf("Task %d finish ", id) }
上記のコードでは、まず、容量を持つ semaphore
チャネルを作成します。 of は maxCon
で、同時実行の最大数です。次に、ループを通じて tasks
タスクの goroutine を作成します。各 goroutine が開始される前に、セマフォが semaphore
チャネルから取得され、利用可能な同時実行性がまだあることを示します。タスクの実行後、占有されていたセマフォは解放されます。このようにして、同時実行の数を制限し、同時に実行するゴルーチンが多すぎることによって引き起こされるリソースの枯渇を回避できます。
WaitGroup
を使用して同時タスクを管理する方法を紹介します。 goroutine と WaitGroup
を使用すると、並列処理を簡単に実装でき、マルチコア プロセッサの機能を最大限に活用し、プログラムのパフォーマンスを向上させることができます。この記事がデータの同時実行処理と WaitGroup
の使用方法を理解するのに役立つことを願っています。 以上がGolang および Go WaitGroup でのデータの同時処理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。