Ruby EventMachine,Python Twisted或JavaScript Node.js有什么意义/目的?

CCw*_*CCw 26 twisted nonblocking eventmachine node.js

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

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

Gly*_*yph 19

如果要编写执行网络连接的代码,可以使用其中一个框架.

例如,如果您要编写一个大型多人视频游戏,"设置Java程序......为每个请求分派一个线程"可能不是一个选项; 玩弄许多线程非常复杂,并且表现也很糟糕.更不用说"只产生一堆线程"这一事实缺少了Twisted等一系列管理工具.人.有,比如twistd,处理日志记录,守护进程,启动和关闭等等.

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

EventMachine和Twisted也可用于编写客户端程序; 也许你正在编写一个非基于Web的GUI应用程序,并且你想在客户端和服务器上使用相同的协议实现.

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


小智 6

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


are*_*del 4

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

  • @CCw:不,不会,至​​少在node.js中,您为该进程设置了一个事件,并在完成时获得回调(简而言之),而脚本的其余部分继续异步工作并服务请求。您所描述的是相反的“同步”方法。 (3认同)