ホームページ >バックエンド開発 >Golang >コンテキストを使用して複数の Go ルーチンを正常に終了するにはどうすればよいですか?

コンテキストを使用して複数の Go ルーチンを正常に終了するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-10 05:48:14136ブラウズ

How to Gracefully Terminate Multiple Go Routines Using Context?

複数の go ルーチンをコンテキストと同期する方法

複数の go ルーチンを同期して、そのうちの 1 つが返されたときに終了できるようにするには、コンテキストは効果的solution.

説明:

サンプル コードは 2 つのゴルーチンを作成します。それらを同期するには、context.Context が開始され、両方のゴルーチンに提供されます。各ゴルーチンは select {} ループに入り、コンテキストからのメッセージをリッスンします。

エラーが発生したとき、または特定の条件が満たされたとき:

  1. メインgoroutine は、コンテキストに関連付けられた cancel 関数を呼び出します。
  2. これにより、「done」メッセージがcontext.
  3. コンテキストをリッスンしているすべてのゴルーチンは、このメッセージを受信して​​終了します。

コード サンプル:

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()
}

使用するメリットコンテキスト:

  • 集中制御: 明示的な同期メカニズムの必要性を回避し、コードをクリーンに保ちます。
  • エラー処理: 1 つの goroutine でエラーが発生した場合、その goroutine を通じて他の goroutine に通知できます。 context.
  • 正常な終了: ゴルーチンはできるだけ早く終了するシグナルを受け取り、メモリ リークの可能性を防ぎます。

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

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