26

我不明白这些框架解决了什么问题。它们是 Apache HTTPD、Tomcat、Mongrel 等 HTTP 服务器的替代品吗?或者他们更多?我为什么要使用它们……一些真实世界的例子?我见过无数的聊天室和广播服务的例子,但看不出这与例如设置一个 Java 程序来打开套接字并为每个请求分派一个线程有什么不同。

我想我了解非阻塞 I/O,但我不明白这与多线程 Web 服务器有何不同。对于 Node.js,我读到它只有一个线程,这可能比同时处理多个线程更有效,但这是这些框架和传统 Web 服务器之间的唯一区别吗?

4

3 回答 3

19

如果您想编写网络代码,您可以使用这些框架之一。

例如,如果您要编写大型多人视频游戏,“设置一个 Java 程序……为每个请求分配一个线程”可能不是一个选项。处理这么多线程非常复杂,而且性能也很差。更不用说“只产生一堆线程”缺少一堆 Twisted 等管理工具的事实。人。have, like twistd,它处理日志记录、守护进程、启动和关闭等。

或者,如果您想编写一个构建自动化系统异步调用和控制子流程的能力会很有用。如果您异步生成一个进程,您可以轻松地终止该进程并优雅地处理它的退出。如果您通过启动一个线程并在该线程中阻塞来生成它,您将无法轻易停止它,因为停止线程本质上是 unsafe

EventMachine 和 Twisted 都可以用来编写客户端程序;也许您正在编写一个不基于 Web 的 GUI 应用程序,并且您希望在客户端和服务器上使用相同的协议实现。

由于您可以在许多不同的上下文中使用异步框架,因此您可能只想在 Web 应用程序中使用它,因为您有现有的库代码,这些代码是使用您想要使用的异步框架为其他应用程序编写的。或者您可能希望能够在一些假设的未来非 Web 应用程序中重用您的 Web 应用程序代码。在这种情况下,它与使用 Apache 或 Tomcat 或其他任何功能没有太大区别,它只是为您提供了一种更通用、可重用的方式来组织您的程序。

于 2010-05-29T13:51:09.710 回答
6

事实上,基于事件的框架适用于您有大量 io 和较少 cpu 操作的情况,但这定义了大多数网页,因为它们等待 db。其他示例是聊天或 youtube 等视频 - 一个堆栈允许同时为更多客户提供服务。基于事件的服务器能够处理数十或数百个连接的客户端,这样数量的线程会杀死机器。当您确实需要进行一些处理时,它们的效率会降低。

于 2010-05-29T09:35:56.513 回答
4

每个连接没有堆栈。每个处理器内核只有一个堆栈。并不是说它实际上一次只能做一件事——为什么不等到某件事情忙的时候再切换任务,而不是随意来回拉扯呢?

于 2010-05-29T03:15:49.783 回答