等待 Go 例程完成
在 Go 中,常见的做法是使用 goroutine 来执行并发任务。为了确保主程序在退出之前等待所有 goroutine 完成,实现适当的同步机制至关重要。
问题中提到的一种方法涉及使用布尔通道(完成):
func do_stuff(done chan bool) { fmt.Println("Doing stuff") done <- true }
func main() { fmt.Println("Main") done := make(chan bool) go do_stuff(done) <-done }
为什么
操作
取消注释最后一行导致死锁:
取消注释 main 中的最后一行会导致死锁:
func main() { fmt.Println("Main") done := make(chan bool) go do_stuff(done) <-done // <-done }
这一秒
使用sync包的替代同步方法:
对于更复杂的场景,sync包提供替代同步原语。在提供的代码中,sync.WaitGroup可以有效地跟踪goroutine完成情况:
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() }() } // will wait until wg.Done is called 10 times (10 goroutines finish) wg.Wait() } func longOp() { time.Sleep(time.Second * 2) fmt.Println("long op done") }
使用sync.WaitGroup确保main在退出程序之前等待所有10个goroutine完成。
以上是如何确保 Go 例程在主退出之前完成?的详细内容。更多信息请关注PHP中文网其他相关文章!