18

这可能是一个愚蠢的问题,但究竟什么是“非阻塞 Web 服务器”?所有的 Web 服务器在技术上都是非阻塞的,不是吗?否则他们如何处理同时连接?Apache2 使用 fork() 和 pthreads 的组合来实现这一点。Tornado(和 Twisted)到底有什么不同?他们是否只是将一堆套接字设置为非阻塞模式,构建一个 FD 列表(或等效的),然后用一个大的 select() 系统调用循环它?

你会在哪里使用这样的框架,与 Apache2(或其他流行的服务器)相比,它们能给你带来什么优势?谢谢

4

1 回答 1

12

EventMachine上的这篇文章也可能给你一个提示:

几年前,当我加入滑铁卢大学的一个研究项目时,我深陷于分叉/线程化网络服务器的传统中,我发现自己相当惊讶:我们正在对不同的网络服务器架构进行基准测试,而表现最好的人都是事件-驱动服务器。

当我向每个人提出问题时,我很快意识到为什么 - 在每秒有数十万个请求的环境中,与线程管理相关的分叉和上下文切换变得非常昂贵(fork 表现最差,因为它在父进程上进行内存复制每次)。相比之下,紧密且高度优化的事件循环在重负载下的性能方面确实很出色。

于 2009-09-14T04:37:35.430 回答