针对epoll和协程的疑问?
我看了一些协程的实现,很多是通过epoll来作为协程调度器,但是,我这里有一个问题:
通过epoll是可以得到所有已经就绪了的文件描述符,也就意味着每次的操作都是非阻塞的,此时,为什么还需要创建协程呢?
例如这位兄弟的写法:http://www.qmailer.net/archiv...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
楼上说的不错
协程可以理解为 快速 轻量的IO调度 本质还是异步的
https://www.bilibili.com/vide...
可以看看这个视频哦,两者搭配起来更好食用,可把事件循环和业务逻辑解耦
这个问题是我提的。
经过一段时间的学习,阅读别人的源码,写了一个协程库,现在我来回答一下。希望对有同样问题的同学有所帮助。
首先,要实现协程这个东西很简单,网上的例子一大把,但是很多都是停留在对上下文的分析,停留在寄存器的值如何保存。私以为,要让协程好用,还必须要把一系列的阻塞api封装成非阻塞的,并且要有一个很好用的调度器。总不可能自己在业务层resume,yeild。
这个调度器做的事情就是去判断协程是否满足被调度的条件。那么,问题来了,协程会因为哪些原因而被挂起呢?除了读写IO外,还有可能是自己执行了协程化的sleep函数。
而判断协程是否满足被调度的条件,这一切都是可以通过epoll来实现的。
epoll除了可以处理多个fd之外,还可以实现定时器的功能。所以说,epoll并不是说和协程没有任何关系,如果我想要通过epoll来实现一个协程调度器,这样子说还是有一点关系的。
首先要理解这两个概念的区别:
epoll是操作系统在网络层面的多路复用机制是为了能够支撑更多的连接来设计的。
协程则是一种更加抽象层面的编程手段,一般是在语言层面或者框架层面来实现,至于实现的手段是什么则取决于语言或者框架开发者了,与协程对应的应该是线程。
epoll是网络IO模型,是用来处理并发网络请求的,一般现在开发的所谓高并发的服务,大都基于epoll。
而 goroutine 是用来处理线程创建和调度过于耗资源的,尤其是线程出现阻塞,io等待的时候,会出现上下文切换,非常耗时。而 goroutine 相对比较轻量级。