ホームページ >バックエンド開発 >Golang >Golangでコルーチンを終了する方法

Golangでコルーチンを終了する方法

(*-*)浩
(*-*)浩オリジナル
2019-12-27 11:14:585050ブラウズ

Golangでコルーチンを終了する方法

Goroutine とチャネルは Go 言語の優れた機能であり、非常に軽量で使いやすい同時実行機能を提供します。 しかし、アプリケーション プロセスに多数のゴルーチンがある場合、メイン プロセスですべてのゴルーチンが終了するまでどのように待つのでしょうか?

1 チャネル を通じて終了信号を渡します (推奨学習: Go )

GO. データは共有メモリを通じて共有されません。メインプロセスは、次のようなチャネルを通じて任意の goroutine に停止信号を送信できます。

func run(done chan int) {
        for {
                select {
                case <-done:
                        fmt.Println("exiting...")
                        done <- 1
                        break
                default:
                }
 
                time.Sleep(time.Second * 1)
                fmt.Println("do something")
        }
}
 
func main() {
        c := make(chan int)
 
        go run(c)
 
        fmt.Println("wait")
        time.Sleep(time.Second * 5)
 
        c <- 1
        <-c
 
        fmt.Println("main exited")
}

このメソッドは goroutine を正常に停止できますが、goroutine が多すぎる場合、このメソッドは見た目が良くありません。コードの外観はまだ管理が不器用なようです。

2 waitgroup を使用する

同期パッケージの Waitgroup 構造は、Go 言語によって提供される複数の goroutine 間の同期に適したツールです。以下は公式ドキュメントの説明です:

通常、waitgroup は次のように使用します:

ここでは wg## と呼ぶとして、Waitgroup のインスタンスを作成します。

#各ゴルーチンが開始されるとき、wg.Add(1) を呼び出します。この操作は、ゴルーチンの開始前に呼び出すことも、ゴルーチンの内部で呼び出すこともできます。もちろん、n 個のゴルーチンを作成する前に wg.Add(n)

を呼び出すこともできます。各ゴルーチンがそのタスクを完了した後、wg.Done()

を呼び出し、待機している場所で呼び出します。すべてのゴルーチン.wg.Wait() では、wg.Add(1) を実行したすべてのゴルーチンが wg.Done() を呼び出す前にブロックされ、すべてのゴルーチンが wg.Done() を呼び出した後に戻ります。

以上がGolangでコルーチンを終了する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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