Con*_*ion 4 asynchronous network-programming epoll nonblocking
我一直认为民意调查/ epoll不会阻止.这就是Nginx等非阻塞服务器使用它们的原因.
但是在这个Stackoverflow问题中,有几次表明轮询阻塞了.
民意调查/ epoll块也是如此?
poll/epoll与异步IO的区别如何?
是的,民意调查/ epoll阻止.将线程分离到服务客户端的服务器通常不能像使用epoll这样的I/O事件通知模型的服务器一样扩展.民意调查比epoll(O(n)vs O(1))更老,效率更低.
[UPDATE]
Nginx不是非阻塞的.当请求进入时,epoll_wait正在等待的事件之一被通知,并且对epoll_wait的调用返回.然后Nginx循环通过为每个事件服务的信号事件.Nginx源代码可在此处获取... http://nginx.org/download/nginx-1.1.1.tar.gz
看一下ngx_epoll_process_eventsnginx-1.1.1\src\event\modules \ngx_epoll_module.c中的函数.
[UPDATE2]
另请参见epoll_wait(2)的手册页... http://linux.die.net/man/2/epoll_wait
#include <sys/epoll.h>
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
Run Code Online (Sandbox Code Playgroud)
指定超时为-1会使epoll_wait(2)无限期地等待,而指定超时等于零会使epoll_wait(2)立即返回,即使没有可用的事件(返回代码等于零).
[UPDATE3]
为了向自己证明Nginx/epoll阻塞,请在Linux上试试这个...
./configure --with-debug (注意:我必须添加libpcre3-dev)makesudo make install/usr/local/nginx/sbin/nginx 注意:我必须先杀死apache sudo /etc/init.d/apache2 stop)sudo gdbfile /usr/local/nginx/sbin/nginxb ngx_epoll_module.c:531 (设置一个断点)ps -ef | grep nginx使用nginx工作进程的PID(不是主服务器)attach <PID of nginx worker>continue 恢复这个过程你可能需要continue几次,但最终应该阻止.然后打开浏览器并转到http:// localhost ...然后调试器应该在epoll_wait返回后立即中断.