Go で Goroutine ライフ サイクルを管理する中心的な方法は次のとおりです: context を使用します。Context: キャンセル シグナルと期限を通じて Goroutine ライフ サイクルを制御します。 sync.WaitGroup を使用します。メインの Goroutine が実行を継続できるように、Goroutine がタスクを完了するまで待ちます。チャネルを使用する: シグナル通信を通じて複数の Goroutine を調整し、すべての Goroutine が完了した後に後続の処理を待ちます。
Go で Goroutine のライフサイクルを管理する
Goroutine は同時実行をサポートする Go の軽量スレッドです。これらの管理は、リソースのリークやプログラムのクラッシュを防ぐために非常に重要です。この記事では、Goroutine のライフ サイクルを管理するさまざまな方法について説明します。ライフサイクル キャンセルおよび期限シグナルを伝播するメカニズム。これを使用して Goroutine のライフサイクルを管理するには、次の手順を実行します:
package main import ( "context" "fmt" "time" ) func main() { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() go func() { // Goroutine 的代码 }() // 等待 Goroutine 完成,或超时。 select { case <-ctx.Done(): fmt.Println("Goroutine 已取消或超时。") } }
2. sync.WaitGroup
を使用して許可します。ゴルーチンは、それぞれのタスクを完了するまで、お互いを待ちます。これを使用して、Goroutine のライフサイクルを管理します。すべての子 Goroutine が完了するまでメイン Goroutine で待つことができます。 context.Context
context.Context
提供了一种在 Goroutine 内传播取消和截止日期信号的机制。要使用它来管理 Goroutine 的生命周期,可以使用以下步骤:
package main import ( "fmt" "runtime" "sync" ) func main() { wg := sync.WaitGroup{} // 创建 5 个子 Goroutine for i := 0; i < 5; i++ { wg.Add(1) // 递增WaitGroup计数,表明正在等待另一个Goroutine完成 go func(i int) { fmt.Printf("Goroutine %d 结束。\n", i) wg.Done() // 递减WaitGroup计数,表明Goroutine已完成 }(i) } // 等待所有子 Goroutine 完成 wg.Wait() fmt.Println("所有子 Goroutine 都已完成。") }
2. 使用 sync.WaitGroup
sync.WaitGroup
package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup signals := make(chan struct{}) // 创建 5 个子 Goroutine for i := 0; i < 5; i++ { wg.Add(1) go func(i int) { defer wg.Done() // Goroutine退出时递减WaitGroup计数 // 等待其他Goroutine完成 <-signals fmt.Printf("Goroutine %d 已完成。\n", i) }(i) } // 等待所有子 Goroutine完成 wg.Wait() // 发送信号标记所有子Goroutine都已完成 close(signals) fmt.Println("所有子 Goroutine 都已完成。") }
3. チャネルの使用
チャネルはゴルーチン間で通信でき、ライフサイクルの管理にも使用できます。マスターゴルーチンは、ゴルーチンを完了としてマークする信号をチャネルに送信することで、すべての子ゴルーチンが完了するのを待つことができます。りー
以上がGo で Goroutine のライフサイクルを管理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。