用了epoll还需要非阻塞么?

因为epoll每次返回的是有数据可读的fd,那么read的话肯定不会阻塞住的,那么用了epoll之后是不是就不要再把fd设为非阻塞了呢???

阅读 3.5k
3 个回答

一般不需要设置。因为fd的NON_BLOCK会增加程序的复杂度,数据写没写完还要额外判断,加上epoll是回调机制,这样还需要维护另外一个逻辑。网络速度现在很快了,一般读写都是可以立即返回的。没必要。

IO多路复用+阻塞式。仅使用一个线程就可以实现对多个描述符的状态管理,但由于IO输入输出调用本身是阻塞的,可能出现某个IO输入输出过慢,影响其他描述符的效率,从而体现出整体性能不高。此种方式编程难度比较低。
单考虑read是不需要的,不过考虑到write的时候,由于对端的速率未知,可能影响整体性能。

需要的,比如单线程Reactor情况下(Redis)。还有就是,多线程情况下,如果Read阻塞了,那这个线程就浪费在等待IO了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进