ホームページ >バックエンド開発 >Golang >Go で複数のゴルーチンを同時に正常に強制終了するにはどうすればよいですか?

Go で複数のゴルーチンを同時に正常に強制終了するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-05 00:48:11686ブラウズ

How to Gracefully Kill Multiple Goroutines Simultaneously in Go?

Go で複数の goroutine を一度に終了する方法

Go では、複数の goroutine を同時に終了する必要があるシナリオに遭遇することがあります。これは、1 つのゴルーチンの完了が他のゴルーチンの終了をトリガーする必要がある場合に特に便利です。

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

func main() {

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

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

}

この場合、ゴルーチンの 1 つが実行されたときに、戻った場合、もう一方も終了する必要があります。これを実現する一般的なアプローチは、シグナリングにチャネルを使用することです。ただし、これにより、クローズド チャネルへの書き込みパニックが発生する可能性があります。

この問題に対する確実な解決策は、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()
}

この例では、終了シグナルをチェックするために goroutine に渡すことができるコンテキストを作成します。 3 番目のゴルーチンが操作を完了すると、cancel() が呼び出され、完了を待っている両方のゴルーチンにシグナルが送信されます。その結果、すべてのゴルーチンは正常に終了します。

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

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