Golang中不要使用无限循环检查goroutine是否完成工作
2014-04-25 15:08
260 查看
在使用goroutine时,我们经常会写出这样的代码:
运行之后发现main中的无限循环永远也无法退出,所以Go中不要用这种无限轮询的方式来检查goroutine是否完成了工作。
我们可以通过使用channel,让foo()和main()实现通信,让foo()执行完毕后通过channel发送一个消息给main(),告诉它自己的事儿完成了,然后main()收到消息后继续执行其他操作:
如果转载请注明出处:http://blog.csdn.net/gophers/article/details/24472891
package main import ( "fmt" ) var ( flag bool str string ) func foo() { flag = true str = "setup complete!" } func main() { go foo() for !flag { //按照我们的本意,foo()执行完毕后,flag=true,循环就会退出。 //但是其实这个循环永远都不会退出 } fmt.Println(str) }
运行之后发现main中的无限循环永远也无法退出,所以Go中不要用这种无限轮询的方式来检查goroutine是否完成了工作。
我们可以通过使用channel,让foo()和main()实现通信,让foo()执行完毕后通过channel发送一个消息给main(),告诉它自己的事儿完成了,然后main()收到消息后继续执行其他操作:
package main import ( "fmt" ) var ( flag bool str string ) func foo(ch chan string) { flag = true str = "setup complete!" ch <- "I'm complete." //foo():我的任务完成了,发个消息给你~ } func main() { ch := make(chan string) go foo(ch) <-ch //main():OK,收到你的消息了~ for !flag { } fmt.Println(str) }
如果转载请注明出处:http://blog.csdn.net/gophers/article/details/24472891
相关文章推荐
- golang使用pprof检查goroutine泄露
- golang使用pprof检查goroutine泄露
- golang使用pprof检查goroutine泄露
- 以学习的身份使用一种语言完成工作是否值得?目标:从文件中分割多个章节
- 使用EditPlus技巧,提高工作效率(附英文版、自动完成文件、语法文件下载)
- [ajax开发工具]使用JSLint完成JavaScript语法检查
- 使用ps检查命令是否只有一个实例
- iOS使用高德地图趟过的坑([MAMapKit] apiKey为空,请检查key是否正确设置)
- [唐胡璐]Excel技巧 - 使用Excel 2007完成多人协同录入工作
- 检查iOS项目中是否使用了IDFA
- 第二次使用C++BUILDER开发SOCKET通讯程序,工作完成
- [问题大概解决了,应该就是单键模式使用不当产生的。明天找人来做一下压力测试]又一次斗胆发到了首页。期盼帮我检查下objDB类是否有问题
- 使用complete属性判断图片是否加载完成
- iOS开发中使用UIScrollView实现无限循环的图片浏览器
- ElasticSearch安装,ES启动,检查ES是否成功,Kibana下载和安装,Kibana的使用
- 循环中使用break时一定要记得更新变量是否已经正常更新,特别是FOR语句中
- 使用EditPlus技巧,提高工作效率(附英文版、自动完成文件、语法文件下载)
- 网络编程(17)—— 使用recv检查输入缓存是否有数据
- 检查iOS项目中是否使用了IDFA
- jQuery:使用$获取对象后检查该对象是否存在