非阻塞的http服务器,Java NIO,Python Tornado和Eventlet。

4

你好,我想了解tornado/eventlet基于HTTP的服务器是否比线程服务器更好。在搜索过程中,我看到它们是单线程事件驱动服务器,可以在socket上进行select/poll/epoll操作后运行单个处理程序函数。

  • 我的第一个问题是,tornado/eventlet是否类似于Java中的nio库,而Java nio服务器是非阻塞且快速的。
  • 我的第二个问题是,由于这些事件驱动的服务器是单线程的,如果一个连接在文件IO或慢客户端上阻塞,会导致整个服务器挂起吗?
  • 我的第三个问题是,如果非阻塞服务器很快,那么为什么它不像apache那样普及呢?

这些问题是相关的,我希望能得到合适的回答。

谢谢!


1
请查看以下文章:《Asynchronous, Event-Driven Web Servers for the JVM: Deft and Loft》(http://www.infoq.com/articles/deft-loft)。 - Jonas
1个回答

4

如果你的所有库都提供了非阻塞API,则非阻塞服务器是最佳选择。如你在第二个问题中提到的,如果一个库阻塞(例如数据库库发出阻塞调用),整个进程/线程会阻塞,系统会停止响应。并非所有可用的库都是异步的,这使得在所有用例中使用tornado/eventlet变得困难。此外,在多核计算机上,需要启动多个非阻塞服务器实例才能充分利用计算机的容量。

Tornado / Event 服务器类似于基于Java NIO的服务器。 Tornado和Eventlet之间存在一个概念上的区别。Tornado遵循反应器模式,其中单个进程等待IO(socket)事件并将其分派给适当的处理程序。如果处理程序不阻塞,则可以期望最佳性能。通常为这些框架编写的代码由一系列回调组成,这使其比同步服务器稍微难以理解。Java NIO服务器属于此类别。

Eventlet执行相同的任务,但具有更清晰的界面。可以像同步服务器一样编写代码,而无需使用回调。遇到IO时,Eventlet会调度另一个用户空间进程(说明可能不太准确)。

Apache Web应用程序比这些框架更受欢迎的原因是:

  • 编写同步代码相对容易。
  • 并非所有所需库都是异步的。

但对于处理许多连接的聊天应用程序,多线程服务器将无法扩展。必须使用异步框架,如twisted / event / Java NIO。


请注意,“多个非阻塞服务器实例”不必完全不同。使用多个线程(或Python的multiprocessing模块)的混合模型,每个线程都使用非阻塞代码路径,可以获得最佳性能、集成和(通常)管理便利性。 - Nicholas Knight
你可以使用多进程并运行多个实例。但是,如果出于某种原因需要共享状态,则必须引入共享内存、队列/命名管道等。 - Anoop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接