ホームページ > バックエンド開発 > Golang > エラーが発生したときに Go で複数の Goroutine を正常にシャットダウンする方法は?

エラーが発生したときに Go で複数の Goroutine を正常にシャットダウンする方法は?

Patricia Arquette
リリース: 2024-12-07 12:03:16
オリジナル
667 人が閲覧しました

How to Gracefully Shutdown Multiple Goroutines in Go When an Error Occurs?

Go での複数の goroutine の正常なシャットダウン

Go アプリケーションでは、複数の goroutine のシャットダウンを調整することが、クリーンで同期的な終了を保証するために重要です。この記事では、どちらかのルーチンでエラーが発生したときに一緒に戻るように 2 つのゴルーチンを同期する問題について説明します。

次のコード スニペットを考えてみましょう。

func main() {

  go func() {
    ...
    if err != nil {
      return
    }
  }()

  go func() {
    ...
    if err != nil {
      return
    }
  }()


}
ログイン後にコピー

このシナリオでは、ゴルーチンの同期が必要です。そのため、一方がエラーに遭遇して復帰すると、もう一方も終了する必要があります。課題は、パニックを引き起こす可能性がある閉じたチャネルへの書き込みを導入せずにこれを達成することにあります。

非常に効果的な解決策には、ゴルーチン間の通信に Go のコンテキスト パッケージを利用することが含まれます。コンテキストを作成し、それを各ゴルーチンに渡すことで、終了を通知するメカニズムを提供できます。このアプローチを示す更新されたコード スニペットは次のとおりです。

package main

import (
    "context"
    "sync"
)

func main() {

    ctx, cancel := context.WithCancel(context.Background())
    wg := sync.WaitGroup{}
    wg.Add(3)
    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
            }
        }
    }()

    go func() {
        defer wg.Done()
        // your operation
        // call cancel when this goroutine ends
        cancel()
    }()
    wg.Wait()
}
ログイン後にコピー

このコードでは、コンテキスト変数 ctx がゴルーチン間の通信チャネルとして機能します。いずれかのゴルーチンでエラーが発生すると、コンテキストで cancel() が呼び出され、他のゴルーチンに終了するよう通知されます。このエレガントなソリューションにより、パニックのリスクを伴うことなく、すべてのゴルーチンが正常にシャットダウンされます。

以上がエラーが発生したときに Go で複数の Goroutine を正常にシャットダウンする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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