ホームページ >バックエンド開発 >Golang >Go のコンテキスト パッケージはどのようにして複数のゴルーチンを正常に終了させることができるのでしょうか?

Go のコンテキスト パッケージはどのようにして複数のゴルーチンを正常に終了させることができるのでしょうか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-04 17:02:11167ブラウズ

How Can Go's Context Package Ensure Graceful Termination of Multiple Goroutines?

ゴルーチンとコンテキストの同期

Go では、ゴルーチンを操作するときに、順序よく終了することを保証するという課題があります。複数のゴルーチンが独立して動作するシナリオを考えますが、1 つのゴルーチンが終了すると他のゴルーチンも終了するようにそれらを同期したいとします。

提供されたコード スニペットには、継続的に実行される 2 つのゴルーチンが含まれています。 1 つのゴルーチン内でエラーが発生した場合は、両方を終了する必要があります。完了を通知するためにチャネルを使用すると、閉じられたチャネルへの書き込みによりパニックが発生する可能性があります。

このようなシナリオに推奨されるアプローチは、ゴルーチン間の通信を可能にする Go のコンテキスト パッケージを採用することです。

以下のコード例では、context.WithCancel を使用したキャンセル関数でバックグラウンド コンテキストが作成されます。実行中のゴルーチンの数を追跡するために、sync.WaitGroup が作成されます。

package main

import (
    "context"
    "sync"
)

func main() {

    ctx, cancel := context.WithCancel(context.Background())
    wg := sync.WaitGroup{}
    wg.Add(3)

3 つのゴルーチンが開始されます。最初の 2 つのゴルーチンは継続的に実行され、コンテキストからのシグナルを待ちます。シグナルを受信すると、正常に終了します。

    go func() {
        defer wg.Done()
        for {
            select {
            // msg from other goroutine finish
            case <-ctx.Done():
                // end
            }
        }
    }()

    go func() {
        defer wg.Done()
        for {
            select {
            // msg from other goroutine finish
            case <-ctx.Done():
                // end
            }
        }
    }()

3 番目のゴルーチンは操作を実行し、タスクの完了を通知するために cancel 関数を呼び出します。このアクションにより、コンテキストを閉じるよう促され、他の 2 つのゴルーチンの終了がトリガーされます。

    go func() {
        defer wg.Done()
        // your operation
        // call cancel when this goroutine ends
        cancel()
    }()

最後に、wg.Wait 関数は、メイン ルーチンが終了する前に、3 つのゴルーチンがすべて完了するのを待ちます。

    wg.Wait()
}

このコンテキストベースのアプローチにより、いずれかのゴルーチンが終了すると、他のゴルーチンが通知されて正常に終了し、クリーンでクリーンなゴルーチンが提供されます。 goroutine 同期を処理する効率的な方法。

以上がGo のコンテキスト パッケージはどのようにして複数のゴルーチンを正常に終了させることができるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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