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 サイトの他の関連記事を参照してください。