ホームページ >バックエンド開発 >Golang >すべてのゴルーチンが終了した後、Go プログラムを正常に終了するにはどうすればよいですか?

すべてのゴルーチンが終了した後、Go プログラムを正常に終了するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-06 04:45:10615ブラウズ

How Can I Gracefully Exit a Go Program After All Goroutines Have Finished?

Go ルーチンを適切に待機してプログラムを正常に終了する

Go ルーチンを使用する場合、プログラムを終了する前にそれらが完了していることを確認することが重要です。ルーチンの終了を待つ仕組みを理解することで、効果的に実装することができます。

「<- 完了」の仕組みを解明

待機の鍵Go ルーチンは、ブロッキング操作である「<-done」ステートメントを使用しています。これは、値がチャネルに送信されるまでプログラムが一時停止することを意味します。あなたが提供した例では、「done」チャネルは「do_stuff」ルーチンの完了を通知するために使用されます。 「done <- true」が実行されると、「<- done」ステートメントのブロックが解除され、プログラムが続行できるようになります。

適切な同期によるデッドロックの回避

最後の行のコメントを解除すると、「done」チャネルがすでに 1 回読み取られているため、デッドロックが発生します。デッドロックは、2 つ以上のルーチンが相互に保持しているリソースを取得しようとすると発生し、依存関係が生じて処理の進行が妨げられます。これを回避するには、ルーチンとチャネルの間で適切な同期を確保してください。

長時間実行される関数を並列化するシナリオでは、「sync」パッケージがより堅牢なソリューションを提供します。 「sync.WaitGroup」タイプを使用すると、アクティブなルーチンの数を追跡し、続行する前にそれらが完了するのを待つことができます。以下の例は、このアプローチを示しています。

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            longOp()
            wg.Done()
        }()
    }

    // Wait for all routines to finish
    wg.Wait()
}

func longOp() {
    time.Sleep(time.Second * 2)
    fmt.Println("Long operation completed")
}

「sync.WaitGroup」を使用すると、プログラムは、長時間実行される関数がすべて完了するまで待ってから続行するようになり、潜在的なデッドロックを回避できます。これにより、Go ルーチンを調整するためのより制御されたアプローチが提供されます。

以上がすべてのゴルーチンが終了した後、Go プログラムを正常に終了するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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