本文摘自php中文网,作者(*-*)浩,侵删。

goroutine和channel是Go语言非常棒的特色,它们提供了一种非常轻便易用的并发能力。但是当您的应用进程中有很多goroutine的时候,如何在主流程中等待所有的goroutine 退出呢?
1 通过Channel传递退出信号 (推荐学习:go)
Go的一大设计哲学就是:通过Channel共享数据,而不是通过共享内存共享数据。主流程可以通过channel向任何goroutine发送停止信号,就像下面这样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | func run(done chan int) {
for {
select {
case <-done:
fmt.Println("exiting...")
done <- 1
break
default:
}
time.Sleep(time.Second * 1)
fmt.Println("do something")
}
}
func main() {
c := make(chan int)
go run(c)
fmt.Println("wait")
time.Sleep(time.Second * 5)
c <- 1
<-c
fmt.Println("main exited")
}
|
这种方式可以实现优雅地停止goroutine,但是当goroutine特别多的时候,这种方式不管在代码美观上还是管理上都显得笨拙不堪。
阅读剩余部分
相关阅读 >>
21 golang中的接口(一)
聊聊dubbo-go-proxy的parammapper
golang 如何实现微服务
2021-03-10 腾讯实习面试
golang 适合开发什么
[golang]从sync.waitgroup看内存对齐
golang 创建型设计模式 工厂方法
embed小技巧-动态文件更新
聊聊dapr的limiter
golang如何获取客户端ip?
更多相关阅读请进入《golang》频道 >>
老貘
一个与时俱进的Go编程知识库。
转载请注明出处:木庄网络博客 » golang 如何结束一个协程