以前用golang做并发处理的时候,很是粗暴,就是利用golang的高级性能,直接fork一个任务,来处理请求,最典型的就是直接 go func,当时是因为用http和socket没觉得什么,今天再次看golang的goroutine的时候,发现这几天写的程序有些问题。比如用goroutine的时候,同步堵塞。太快了,需要堵堵,不然我没法判断逻辑了。

原文地址,blog.xiaorui.cc

来个简单的例子:

wKiom1MtuyqyA9WiAABz1gj0xqw874.jpg

原文:xiaorui.cc

这个是打印屌丝的数量,golang下的并发直接go 函数就可以了,但是单纯的go的话,他会因为后续的main主函数的任务结束,而结束 。 对于main来说,我已经运行完了,刚才go出去的任务,爱咋咋地。。。 他就这么不负责不管了。   其实这里咱们先不说用golang的解决的方法, 其实可以在结束的时候做个判断,比如每次go完了后,不管成功或者失败都会给一个全局变量加个数或者赋予一个值。   然后再main里面做一个判断,接着是堵塞这个判断,只有if 匹配后,才推出程序。

这个是土方法,其实咱们可以用golang自带的channel,这个东西初级的想法,可以解决上面的问题。  他在golang里面代表了通信官的作用。

channel有四个操作:

创建:c = make(chan int)

发送:c <- 1

提取:i <- c

关闭:close(c)

里面的10是buffered channels,指定channel的缓冲大小

       ch := make(chan type, value)

       value == 0 !无缓冲(阻塞)

       value > 0 !缓冲(非阻塞,直到value个元素)


大家可以跑跑下面的例子,加深下channel的理解 。

对于golang的同步问题,不仅可以用channel来解决,也可以用golang的另一个包 sync来解决。

sync.WaitGroup只有3个方法,Add(),Done(),Wait()。其中Done()是Add(-1)的别名。简单的来说,使用Add()添加计数,Done()减掉一个计数,计数不为0, 阻塞Wait()的运行。

python下的gevent里面的协程机制和golang差不多的,有时间让他们对比下,看看gevent比golang的goroutine相差有多少。 

遇到的问题,这个是因为本身网络就不稳定引起的,为了更友好的显示数据,需要做好更好的defer异常的处理。



对Python及运维开发感兴趣的朋友可以加QQ群 : 478476595 !!!
{ 2000人qq大群内有各厂大牛,常组织线上分享及沙龙,对高性能及分布式场景感兴趣同学欢迎加入该QQ群 }

另外如果大家觉得文章对你有些作用!   帮忙点击广告. 一来能刺激我写博客的欲望,二来好维护云主机的费用.
如果想赏钱,可以用微信扫描下面的二维码. 另外再次标注博客原地址  xiaorui.cc  ……   感谢!

关于Go语言在服务端做Restful接口和socket通信

下图是关于rest的使用介绍,有些老生常谈了。 当REST架构的约束条件作为一个整体应用时,将生成一个可以扩展到大量客户端的应用程序。它还降...

阅读全文