通过正确等待 Go 例程确保程序顺利退出
使用 Go 例程时,确保它们在退出程序之前完成至关重要。了解等待例程完成背后的机制,就可以有效地实现它。
揭开“
等待的关键Go 例程使用“
通过适当的同步避免死锁
当您取消注释最后一行时,您会遇到死锁,因为通道“done”已经被读取一次。当两个或多个例程尝试获取彼此持有的资源时,就会发生死锁,从而创建阻止它们继续进行的依赖关系。为了避免这种情况,请确保例程和通道之间的正确同步。
在您想要并行化长时间运行的函数的情况下,“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 例程。
以上是当所有 Goroutines 结束后,如何优雅地退出 Go 程序?的详细内容。更多信息请关注PHP中文网其他相关文章!