我不明白这些框架解决了什么问题。它们是Apache HTTPD,Tomcat,Mongrel等HTTP服务器的替代品吗?或者他们更多?为什么我可以使用它们......一些现实世界的例子?我已经看到了无数的聊天室和广播服务的例子,但是看不出这有什么不同,例如,设置一个Java程序来打开套接字并为每个请求分配一个线程。
我想我理解非阻塞I / O,但我不明白它与多线程Web服务器的区别。对于Node.js,我读到它只有一个线程,并且这可能比处理多个线程更有效,但这是这些框架和传统Web服务器之间的唯一区别吗?
答案 0 :(得分:19)
如果要编写可以编写网络的代码,可以使用其中一个框架。
例如,如果您要编写a massively multiplayer video game,“设置Java程序......为每个请求分派一个线程”可能不是一个选项;玩弄许多线程非常复杂,并且表现也很糟糕。更不用说“只产生一堆线程”这一事实缺少了Twisted等一系列管理工具。人。像twistd
一样处理日志记录,守护进程,启动和关闭等等。
或者如果你想写一个build automation system,asynchronously invoke and control subprocesses的能力会很有用。如果异步生成进程,则可以轻松地终止该进程并优雅地处理其退出。如果你通过启动一个线程并在该线程中阻塞来生成它,那么就不能轻易地阻止它,因为stopping a thread is inherently unsafe。
EventMachine和Twisted也可用于编写客户端程序;也许你正在编写一个非基于Web的GUI应用程序,并且你想在客户端和服务器上使用相同的协议实现。
由于您可以在许多不同的上下文中使用异步框架,因此您可能希望在Web应用程序中使用它,因为您有现有的库代码,使用异步框架为其他应用程序编写,您希望使用。或者您可能希望能够在某些假设的未来非Web应用程序中重用您的Web应用程序代码。在这种情况下,它与使用Apache或Tomcat或其他任何功能没有多大区别,它只是为您提供了一种更通用,可重复使用的方式来组织您的程序。
答案 1 :(得分:6)
事实上,基于事件的框架适用于你拥有大量io和较少cpu操作的情况,但它定义了大多数网页,因为它们等待数据库。其他示例是像youtube一样的聊天或视频 - 一个堆栈允许同时为更多客户端提供服务。基于事件的服务器能够处理数十或数百个连接的客户端,其中这样的线程数会杀死机器。当你真正做一些处理时,它们的效率会降低。
答案 2 :(得分:4)
每个连接没有堆栈。每处理器核心只有一个堆栈。这并不是说它一次可以做多件事 - 为什么不等到事情忙于转换任务,而不是随意地来回晃动呢?