2.基于Golang协程实现流量统计系统-range和select的学习

crawler
crawler 2018-10-12 12:15
0 4
作者:何殿斌著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
接下面我们先来学习一下range在goroutine中的使用方法
下面看一下例子。
下面的代码运行肯定报错,我故意这么写的。
hello goroutine!4hello goroutine!3fatal error: all goroutines are asleep - deadlock! 说明:所有的goroutine都取完了。怎么还在取,死了hello goroutine!2
hello goroutine!1,i am goroutine!因为上面的通道取完了后通道为空了。但是for range在从通道中取数据的时候他不知道是空的。所以空了也在取,所以应该在数据发送完毕后关闭通道
应该在哪里呢。根据不同的情况,处理方法都不一样,针对上面的代码。我们发现先进先出的原则,goroutine1先出来了,并且经过拼接字符串并输出了。所以我们应该在拼接后就马上关闭通道
关闭后再运行就正常了

现在我们来说一下select随机选择的功能:
在channel的写入一方,有可能出现有多个goroutine往里写
很有可能出现goroutine内部在往里写之前要做一些处理,比如说网络拉取一些文件,网络请求一端的API会有一些延迟。
怎么在消费的一端做合理的控制,这时我们用select等待机制就派上用场了
现在说一下随机选择机制
如果我们有多个通道呢。就要用到select的随机选择机制了
看下面代码


运行结果:看出来了。ch1,ch2都是交替往通道里写数据的
i am ch1:0i am ch1:0     0     0     0     0     0i am ch1:0     0i am ch1:0     0     0i am ch1:0i am ch1:0     0     0i am ch1:0i am ch1:0i am ch1:0i am ch1:0i am ch1:1i am ch1:1i am ch1:1i am ch1:1i am ch1:1i am ch1:1i am ch1:1i am ch1:1i am ch1:1i am ch1:1     1     1     1     1     1     1     1     1i am ch1:2     1     1i am ch1:2i am ch1:2i am ch1:2i am ch1:2i am ch1:2i am ch1:2i am ch1:2i am ch1:2i am ch1:2i am ch1:3i am ch1:3i am ch1:3i am ch1:3i am ch1:3i am ch1:3i am ch1:3i am ch1:3i am ch1:3i am ch1:3     2     2     2     2     2     2     2     2     2     2i am ch1:4i am ch1:4i am ch1:4i am ch1:4i am ch1:4i am ch1:4i am ch1:4i am ch1:4i am ch1:4i am ch1:4i am ch1:5i am ch1:5i am ch1:5i am ch1:5i am ch1:5i am ch1:5i am ch1:5i am ch1:5i am ch1:5i am ch1:5     3     3     3     3     3     3     3     3     3     3i am ch1:6i am ch1:6i am ch1:6i am ch1:6i am ch1:6i am ch1:6i am ch1:6i am ch1:6i am ch1:6i am ch1:6i am ch1:7i am ch1:7i am ch1:7i am ch1:7i am ch1:7i am ch1:7i am ch1:7i am ch1:7i am ch1:7i am ch1:7
下面看一下select等待机制
等待机制的好处是,一般如果从国外服务器取数据,是延迟非常高的,用time.sleep是没办法知道需要等待几秒钟的。但是如果用select就可以一直无限等待接收通道
我们来看下面代码就明白了
我们先来把sample和sample2里的time.sleep分别设置为3秒和60秒。用来测试select等待机制
运行结果:
可以看出。因为ch1睡3秒往通道中写一次数据,所以select肯定先从ch1中取数据,然后ch2是每隔60秒才往通道中写一次数据,所以ch2输出就比较慢,甚至最后是先把ch1取完后再输出ch2
i am ch1:17i am ch1:17i am ch1:17i am ch1:18i am ch1:18i am ch1:18i am ch1:18i am ch1:18i am ch1:18i am ch1:18i am ch1:18i am ch1:18i am ch1:18i am ch1:19i am ch1:19i am ch1:19i am ch1:19i am ch1:19i am ch1:19i am ch1:19i am ch1:19i am ch1:19i am ch1:19     1     1     1     1     1     1     1     1     1     1     2     2     2     2     2     2     2     2     2     2     3     3     3     3     3     3     3     3     3     3     4     4     4     4     4     4     4     4     4     4
输出结果很长。我就不粘贴了。大家可以自己回去测试一下。
select等待机制非常好。结合上channel非常适合go的协程开发。
好了。下一节课我们将讲解搭建一个网站。用来测试流量统计系统
文章发布只为分享区块链技术内容,版权归原作者所有,观点仅代表作者本人,绝不代表区块链兄弟赞同其观点或证实其描述。
游客
登录后才可以回帖,登录 或者 注册