[阅读笔记]Go语言并发之美
2012-11-30 23:10 轩脉刃 阅读(2947) 评论(0) 编辑 收藏 举报
文章题目:
Go语言并发之美
文章链接:
http://qing.weibo.com/2294942122/88ca09aa33002ele.html
分享笔记:
这篇文章说的是go routine和channel在Go语言中的应用。刚开始看的时候,对文章使用lua的协程来描述goroutine还真是不习惯。建议读者不要跟者作者使用这样的称呼。
并发在Go中得到语言级别的支持。文章列出了几个goroutine和channel的使用方法
1 id生成器
由于id生成器会产生系统调用,所以假设生成随机数这个id生成函数需要很长时间。这个时候就可以使用到并发了。当一个goroutine在运行的时候,另外一个id生成的goroutine在生成id。
2 多路复用
多路复用就是一个动作可以管理或者监听多个并发线程(这里是goroutine)。文中的例子就是使用一个chan来监听多个goroutine,一旦有一个goroutine对chan进行操作,下面的程序就进行了。
例子的最后也说了,实际上Go也提供了select关键字,因此多路复用也可以使用select来对多个chan进行监听,每个goroutine来通过一个chan来传递消息。
3 实现并发中的future技术
future技术是一种并发模式,需要并发处理的时候,创建goroutine返回一个future,当需要这个future返回东西的时候,去future中获取数据。这样的好处就是在编程的时候的思维逻辑是流式的了。
4 并发循环
使用goroutine来提高循环的效率是最容易想到的优化效率的方法了。
5 chainFilter技术
并发的过滤器可以使用goroutine来使用。这个记得nginx的output就是使用chainFilter这样的模式来实现。
6 共享变量
并发过程中的共享变量的使用有可能发生冲突。当然首选会想到使用锁来对共享变量进行控制。
在golang中也可以使用channel来维护共享变量,实际达到的也是锁的功效。
文中的例子使用一个写通道和一个读通道来保持一个共享变量,只能从写通道写入,这个时候,其他的goroutine要使用写通道是不行的,这就达到了写锁的功能。读的功能也是一样的。
7 使用超时来控制协程泄露
协程泄露说的是协程没有合理控制结束(回收)导致协程无法结束,最终导致程序阻塞无法执行了。
这种情况可以使用超时,使用超时就是另外开启一个goroutine来计时,主goroutine使用多路复用监听要监听的goroutine和计时goroutine。记得某个讲goroutine并发的视频也说到这个。在实际项目中,记得给每个可能“泄露”的goroutine加上计时器是尤为重要的。
ps: 最后吐槽下,这篇文章的程序排版真是不爽。
Go语言并发之美
文章链接:
http://qing.weibo.com/2294942122/88ca09aa33002ele.html
分享笔记:
这篇文章说的是go routine和channel在Go语言中的应用。刚开始看的时候,对文章使用lua的协程来描述goroutine还真是不习惯。建议读者不要跟者作者使用这样的称呼。
并发在Go中得到语言级别的支持。文章列出了几个goroutine和channel的使用方法
1 id生成器
由于id生成器会产生系统调用,所以假设生成随机数这个id生成函数需要很长时间。这个时候就可以使用到并发了。当一个goroutine在运行的时候,另外一个id生成的goroutine在生成id。
2 多路复用
多路复用就是一个动作可以管理或者监听多个并发线程(这里是goroutine)。文中的例子就是使用一个chan来监听多个goroutine,一旦有一个goroutine对chan进行操作,下面的程序就进行了。
例子的最后也说了,实际上Go也提供了select关键字,因此多路复用也可以使用select来对多个chan进行监听,每个goroutine来通过一个chan来传递消息。
3 实现并发中的future技术
future技术是一种并发模式,需要并发处理的时候,创建goroutine返回一个future,当需要这个future返回东西的时候,去future中获取数据。这样的好处就是在编程的时候的思维逻辑是流式的了。
4 并发循环
使用goroutine来提高循环的效率是最容易想到的优化效率的方法了。
5 chainFilter技术
并发的过滤器可以使用goroutine来使用。这个记得nginx的output就是使用chainFilter这样的模式来实现。
6 共享变量
并发过程中的共享变量的使用有可能发生冲突。当然首选会想到使用锁来对共享变量进行控制。
在golang中也可以使用channel来维护共享变量,实际达到的也是锁的功效。
文中的例子使用一个写通道和一个读通道来保持一个共享变量,只能从写通道写入,这个时候,其他的goroutine要使用写通道是不行的,这就达到了写锁的功能。读的功能也是一样的。
7 使用超时来控制协程泄露
协程泄露说的是协程没有合理控制结束(回收)导致协程无法结束,最终导致程序阻塞无法执行了。
这种情况可以使用超时,使用超时就是另外开启一个goroutine来计时,主goroutine使用多路复用监听要监听的goroutine和计时goroutine。记得某个讲goroutine并发的视频也说到这个。在实际项目中,记得给每个可能“泄露”的goroutine加上计时器是尤为重要的。
ps: 最后吐槽下,这篇文章的程序排版真是不爽。
实时了解作者更多技术文章,技术心得,请关注微信公众号“轩脉刃的刀光剑影”
本文基于署名-非商业性使用 3.0许可协议发布,欢迎转载,演绎,但是必须保留本文的署名叶剑峰(包含链接http://www.cnblogs.com/yjf512/),且不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系。