ホームページ  >  記事  >  バックエンド開発  >  Golang 同時プログラミング: Go WaitGroup を使用してタスク スケジューラを実装する

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

王林
王林オリジナル
2023-09-27 14:51:391258ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。