gpt4 book ai didi

asynchronous - poll/epoll 会阻塞吗?它与异步 IO 有何不同?

转载 作者:行者123 更新时间:2023-12-04 23:07:47 27 4
gpt4 key购买 nike

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

但在这个Stackoverflow question民意调查被多次声明阻止。

那么 poll/epoll 会阻塞吗?

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

最佳答案

是的,轮询/epoll 块。分出线程来服务客户端的服务器通常不像使用 epoll 之类的 I/O 事件通知模型的服务器那样扩展。 poll 比 epoll 更旧且效率更低(O(n) vs O(1))。

[更新]

Nginx 不是非阻塞的。当一个请求进来时,epoll_wait 正在等待的事件之一被通知并且对 epoll_wait 的调用返回。然后 Nginx 遍历服务于每个事件的信号事件。 Nginx 源代码可在此处获得... http://nginx.org/download/nginx-1.1.1.tar.gz

看看ngx_epoll_process_events nginx-1.1.1\src\event\modules\ngx_epoll_module.c 中的函数

[更新2]

另请参阅 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);

Specifying a timeout of -1 makes epoll_wait(2) wait indefinitely, while specifying a timeout equal to zero makes epoll_wait(2) to return immediately even if no events are available (return code equal to zero).



[更新3]

为了向自己证明 Nginx/epoll 会阻塞,请在 Linux 上试试这个...
  • 下载源码并解压
  • cd 到源目录
  • ./configure --with-debug (注意:我必须添加 libpcre3-dev)
  • make
  • sudo make install
  • 启动 nginx:/usr/local/nginx/sbin/nginx (注意:我必须先杀死 apache sudo /etc/init.d/apache2 stop)
  • sudo gdb
  • file /usr/local/nginx/sbin/nginx
  • b ngx_epoll_module.c:531 (设置断点)
  • 在另一个终端窗口中,ps -ef | grep nginx并使用 nginx 工作进程(不是主进程)的 PI​​D
  • 回到 gdb,attach <PID of nginx worker>
  • continue恢复进程

  • 您可能需要 continue几次,但最终应该会阻塞。然后打开浏览器并转到 http://localhost ...调试器应该在 epoll_wait 之后立即中断返回。

    关于asynchronous - poll/epoll 会阻塞吗?它与异步 IO 有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7209057/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com