ホームページ > バックエンド開発 > Golang > Go でゴルーチンの実行順序を制御するにはどうすればよいですか?

Go でゴルーチンの実行順序を制御するにはどうすればよいですか?

DDD
リリース: 2024-12-29 18:55:10
オリジナル
536 人が閲覧しました

How Can I Control the Order of Execution of Goroutines in Go?

ゴルーチンの実行順序の予測不可能性

提供されたコード スニペットでは、2 つのゴルーチンの実行順序は非決定的です。出力は、最初のゴルーチンの後に開始されたにもかかわらず、2 番目のゴルーチンが最初に実行されたことを示しています。この動作は、ゴルーチンの同時実行の性質によるものです。つまり、ゴルーチンは互いに独立して実行されます。

ゴルーチンの同期メカニズム

ゴルーチンの実行順序を制御するには、Go が提供する同期メカニズムを使用できます。 as:

Channels: チャネルを使用してゴルーチンの実行を同期できます。チャネルは、ゴルーチンがデータを送受信できるようにする通信チャネルです。以下の変更された例では、最初のゴルーチンが実行を完了してから 2 番目のゴルーチンが開始されるまで、チャネルを使用してメインのゴルーチンがブロックされます。

func main() {

    c := make(chan int)

    go sum([]int{1, 2, 3}, c)

    // Use the channel to block until it receives a send
    x := <-c
    fmt.Println(x)

    // Then execute the next routine
    go sum([]int{4, 5, 6}, c)

    x = <-c
    fmt.Println(x)
}
ログイン後にコピー

待機グループ: 待機グループこれは、続行する前に複数のゴルーチンの実行が完了するのを待つことを可能にするもう 1 つの同期メカニズムです。次の例では、待機グループを使用して、メインのゴルーチンが終了する前にすべてのゴルーチンが確実に終了するようにしています。

func sum(a []int, c chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    fmt.Println("summing: ", a)
    total := 0
    for _, v := range a {
        total += v
    }
    // Send total to c
    c <- total
}

func main() {

    c := make(chan int)
    wg := new(sync.WaitGroup)

    // Concurrently call the concurrent calls to sum, allowing execution to continue to the range of the channel
    go func() {
        // Increment the wait group, and pass it to the sum func to decrement it when it is complete
        wg.Add(1)
        go sum([]int{1, 2, 3}, c, wg)
        // Wait for the above call to sum to complete
        wg.Wait()
        // And repeat...
        wg.Add(1)
        go sum([]int{4, 5, 6}, c, wg)
        wg.Wait()
        // All calls are complete, close the channel to allow the program to exit cleanly
        close(c)
    }()

    // Range of the channel
    for theSum := range c {
        x := theSum
        fmt.Println(x)
    }

}
ログイン後にコピー

これらの同期メカニズムを使用すると、ゴルーチンの実行順序を制御し、必要な操作シーケンスが維持されます。

以上がGo でゴルーチンの実行順序を制御するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート