简单的说下select是干什么的?

select用来让我们的程序监视多个文件句柄(file descriptor)的状态变化的处理机制。当你发起一些阻塞的请求后,你可以使用select机制轮训扫描fd,直到被监视的文件句柄有某一个或多个发生了状态改变。 


该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新。

http://xiaorui.cc/?p=2997

本来只是想说下select,但又忍不住废话下说下epoll的处理流程:

我们可以把要监控读写的文件交给内核(epoll_add),而内核通过中断的方式得知事件通知. 这要比select好不少.
设置你关心的事件(epoll_ctl),比如读事件.
然后等(epoll_wait),此时,如果没有哪个文件有你关心的事件,则休眠,直到有事件,被唤醒,然后返回那些事件.
Epoll的优势在于,由接收数据的OS来负责通知你有数据可以操作,因为OS是知道什么时候有数据的。
select 跟golang有啥关联? 首先我们通过上面的介绍得知,select是通过线性扫描的方式监视文件描述符是否有变动. channnel在系统层面来说也是个文件描述符。 在golang里我们可以使用goroutine并发执行任务,接着使用select来监视每个任务的channel情况.  
但如果这几个任务都长时间没有回复channel信息,如果我们又有超时timeout需求,那么我们可以使用起一个goroutine,这个goroutine任务逻辑启动sleep,等sleep之后回复channel信号。 

说了这么多没用的,才聊到咱们golang goroutine select正事….

上面golang那段代码运行后的结果是:

END



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

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

通过golang goroutine stack分析死锁问题

前言:       碰到死锁是一个很让人糟心的事情 ! 更让人无语的事,在测试环境中压力测试了好久都是ok的, 一点毛病都没有。但一到线上的正...

阅读全文

技术分享之《Golang高性能实战》

前言:       2018年后就一直计划在公司做一次技术分享,但迟迟没有确定好主题。正好公司好多同事都开始学习golang,  正好到了由入...

阅读全文

golang channel提前close丢失数据?

前言:        很无聊,闲来无事看golang一些开源代码,发现有些人作为生产者把消息扔到channel就直接顺手给close掉了,也不等消费...

阅读全文

1则回应给“Golang利用select实现goroutine的超时控制”

  1. 董红帅说道:

    这个可以使用 time.After来实现

发表评论