Golang 同時プログラミング: Go WaitGroup を使用してタスク スケジューラを実装する

王林
リリース: 2023-09-27 14:51:39
オリジナル
1233 人が閲覧しました

Golang并发编程:使用Go WaitGroup实现任务调度器

Golang 同時プログラミング: Go WaitGroup を使用したタスク スケジューラの実装

  1. はじめに
    Golang では、同時プログラミングを実装すると、パフォーマンスとパフォーマンスを大幅に向上させることができます。プログラムの効率。タスク スケジューラは並行プログラミングの非常に重要な部分であり、並行タスクの実行シーケンスと同期タスクの完了をスケジュールするために使用できます。この記事では、Golang で WaitGroup を使用して単純なタスク スケジューラを実装する方法と、具体的なコード例を紹介します。
  2. WaitGroup の概要
    WaitGroup は、Golang パッケージ sync の重要なタイプであり、同時タスクの同期および待機機能を提供します。 WaitGroup には、Add、Done、Wait の 3 つの主なメソッドがあります。
  • Add(n int): n 個の同時タスクを WaitGroup に追加します。
  • Done(): タスクを完了としてマークします。
  • Wait(): すべてのタスクが完了するまで待機し、現在の goroutine をブロックします。

WaitGroup は、未完了のタスクの数を記録するために内部的にカウンターを維持します。 Add メソッドが呼び出されると、カウンターは指定された値だけインクリメントされます。Done メソッドが呼び出されると、カウンターは 1 ずつデクリメントされます。Wait メソッドが呼び出されると、カウンターが 0 より大きい場合、現在のゴルーチンは次のようになります。カウンタがゼロに戻るまでブロックされます。

  1. タスク スケジューラの実装
    次は、WaitGroup を使用してタスク スケジューラを実装するサンプル コードです。
package main

import (
    "fmt"
    "sync"
    "time"
)

func worker(id int, wg *sync.WaitGroup) {
    defer wg.Done()
    fmt.Printf("Worker %d starting
", id)
    time.Sleep(time.Second)
    fmt.Printf("Worker %d done
", id)
}

func main() {
    var wg sync.WaitGroup
    for i := 1; i <= 5; i++ {
        wg.Add(1)
        go worker(i, &wg)
    }
    wg.Wait()
    fmt.Println("All workers done")
}
ログイン後にコピー

この例では、for ループを使用して、 5 つのワーカー ゴルーチンを開始し、wg.Add(1) を呼び出してタスクの数を WaitGroup に追加します。ワーカー関数では、 defer キーワードを使用して、関数が戻ってカウンター値をデクリメントする前に wg.Done() が呼び出されるようにします。最後に、wg.Wait() を使用して、すべてのタスクが完了するのを待ちます。

  1. 実行結果
    このサンプル コードを実行すると、次の出力が表示されます:
Worker 1 starting
Worker 2 starting
Worker 3 starting
Worker 4 starting
Worker 5 starting
Worker 3 done
Worker 1 done
Worker 2 done
Worker 5 done
Worker 4 done
All workers done
ログイン後にコピー

すべてのワーカー ゴルーチンが同時に実行されていることがわかります。 goroutine のスケジューリングは Go ランタイムによって実行されるため、出力の順序は必ずしも起動順序になるわけではありません。

  1. 概要
    WaitGroup を使用すると、同時タスクのスケジュールと同期を簡単に実装できます。タスクの同期とシーケンス制御は、Add メソッドを呼び出してタスクの数を追加し、Done メソッドを呼び出してタスクの完了をマークし、Wait メソッドを呼び出してタスクの完了を待つことによって実現できます。実際のアプリケーションでは、タスク スケジューラを使用して同時タスクの処理、同時実行数の制限、その他のシナリオを行うことができ、Golang の同時実行機能をより有効に活用できます。

この記事の概要とサンプル コードを通じて、Golang の WaitGroup を使用してタスク スケジューラを実装する方法についてより深く理解できたと思います。この記事が、Golang での並行プログラミングの学習と使用に役立つことを願っています。

以上がGolang 同時プログラミング: Go WaitGroup を使用してタスク スケジューラを実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!