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