Asynchronous 轮询/e波尔阻塞吗?它与异步IO有何不同?

Asynchronous 轮询/e波尔阻塞吗?它与异步IO有何不同?,asynchronous,network-programming,nonblocking,epoll,Asynchronous,Network Programming,Nonblocking,Epoll,我一直觉得poll/epoll不会阻止我。这就是为什么Nginx等非阻塞服务器使用它们的原因 但在这篇文章中,有人多次表示投票会受阻 poll/epoll是否会阻塞 poll/epoll与异步IO有何不同?是的,poll/epoll块。为客户机提供服务而派生线程的服务器通常不能像使用I/O事件通知模型(如epoll)的服务器那样扩展。poll比epoll(O(n)vs O(1))更老、效率更低 [更新] Nginx不是非阻塞的。当请求传入时,将通知epoll_wait正在等待的事件之一,并返回对

我一直觉得poll/epoll不会阻止我。这就是为什么Nginx等非阻塞服务器使用它们的原因

但在这篇文章中,有人多次表示投票会受阻

poll/epoll是否会阻塞


poll/epoll与异步IO有何不同?

是的,poll/epoll块。为客户机提供服务而派生线程的服务器通常不能像使用I/O事件通知模型(如epoll)的服务器那样扩展。poll比epoll(O(n)vs O(1))更老、效率更低

[更新]

Nginx不是非阻塞的。当请求传入时,将通知epoll_wait正在等待的事件之一,并返回对epoll_wait的调用。然后Nginx循环处理为每个事件提供服务的信号事件。Nginx源代码在这里提供

请查看nginx-1.1.1\src\event\modules\ngx\u epoll\u module.c中的
ngx\u epoll\u process\u events
函数

[更新2]

另请参见epoll_wait(2)的手册页

#包括
int epoll_wait(int epfd、struct epoll_event*events、int maxevents、int timeout);
指定-1的超时将使epoll_等待(2)无限期地等待, 当指定一个等于零的超时值时,epoll_将等待(2)返回 即使没有可用的事件(返回代码等于 零)

[更新3]

为了向自己证明Nginx/epoll是阻塞的,请在Linux上试试这个

  • 下载源代码并取消归档
  • 将cd复制到源目录
  • /configure--with debug
    (注意:我必须添加libpcre3 dev)
  • make
  • sudo make安装
  • 要启动nginx:usr/local/nginx/sbin/nginx(注意:我必须先杀死apache
    sudo/etc/init.d/apache2 stop
  • sudo-gdb
  • file/usr/local/nginx/sbin/nginx
  • b ngx\u epoll\u模块。c:531
    (设置断点)
  • 在另一个终端窗口中,
    ps-ef | grep nginx
    并使用nginx工作进程(而不是主进程)的PID
  • 回到gdb,
    attach
  • 继续
    以继续该过程

  • 您可能需要
    继续几次
    ,但它最终会阻塞。然后打开浏览器并转到。。。然后,调试器应在
    epoll\u wait
    返回后立即中断。

    如果epoll阻塞,使用epoll(例如Nginx)的服务器如何成为非阻塞服务器?感谢更新。那么,如果Nginx是阻塞的,那么它与像Apache这样也阻塞的服务器有何不同呢?此外,epoll()的手册页还谈到了非阻塞用法:“当与EPOLLET标志(边缘触发)一起使用时,epoll接口应该使用非阻塞文件描述符,以避免阻塞读取或写入导致处理多个文件描述符的任务无法执行。”我缺少什么?续:epoll_wait()它本身就是一个阻塞接口。无论何时调用epoll_wait(),它都会阻止线程/进程,直到注册的描述符上发生任何监视的事件。手册页讨论了epoll对非阻塞FDs的使用,这是epoll监视的内容,而不是epoll本身。换句话说,它说如果您正在使用ePallet,您应该只在ePall上注册非阻塞FD。无论如何,无论是要求epoll监视非阻塞还是阻塞FD,epoll接口本身仍然是阻塞basedYou可以像使用非阻塞接口一样使用epoll_wait(),将超时值设置为0。@Continuation Apache将使用新进程/线程处理连接,该进程/线程将阻塞。例如,1000个线程在等待响应时被阻塞。相比之下,Nginx将使用epoll注册1000个连接。但是,如果与这1000个连接无关,它将阻塞。当事件发生时,它将继续。但是,要做到这一点,您只需要一个线程,而不需要一千个。select/poll/epoll块。但是,它可以用于同时等待多个事件,而不仅仅是单个事件。
    #include <sys/epoll.h>
    int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);