在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
我们之前学习了协程和信道,里面有很多例子,当时为了保证main goroutine在所有的goroutine都执行完毕后在退出,我们使用了time.Sleep这种方式 由于写的demo都是很简单的,sleep个1秒,我们感觉应该是够用的 但是在实际开发中,我们无法预知,所有的goroutine需要多长时间才能执行完毕,sleep多了 主程序就会阻塞,sleep少了有的子协程的任务无法完成 我们今天来介绍一下 怎么优雅的处理这种情况 1.使用信道来标记完成信道可以实现多个协程间的通信,那么我们只需要定义一个信道,在任务完成后,往信道中写入true,然后主协程中获取到true,就认为子协程执行完毕 import "fmt" func main() { done := make(chan bool) //开一个协程去执行 go func() { for i := 0; i < 5; i++ { fmt.Println(i) } //执行完毕,往信道里写入true done <- true }() //主协程中如果获取到信道里时true 就退出 <-done } 输出如下 0 1 2 3 4 2.使用WaitGroup上面使用的方法,在单个协程或者协程数量比较少的时候不会有什么问题,但在协程数多的时候,代码就会很复杂 更优雅的方式就是使用WaitGroup WaitGroup只要实例化了就能用 var 实例名 sync.WaitGroup
实例化完成后,就可以使用它的几个方法:
举一个例子 // Startup the EventRouter //这里有一个协程, 所以计数器的值是1 wg.Add(1)
|
请发表评论