Ruby EventMachine,Python Twisted或JavaScript Node.js的重点/目的是什么?

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

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

如果你想编写networking代码,你可以使用这些框架之一。

例如,如果你要编写一个大型的多人游戏 ,“build立一个Java程序……为每个请求派发一个线程”可能不是一种select; 杂耍multithreading是非常复杂的,而且performance也很差。 更何况“只是产生了一堆线程”的事实是缺less了一堆Twisted等人的pipe理工具。 人。 像twistd一样,它处理日志,守护进程,启动和closures等等。

或者如果你想编写一个构build自动化系统 , asynchronous调用和控制subprocess的能力将是有用的。 如果你asynchronous生成一个进程,你可以很容易地杀死这个进程,并优雅地处理它的退出。 如果通过启动线程并在该线程中阻塞来产生线程,则不能轻易停止线程 ,因为停止线程本质上是不安全的 。

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

由于您可以在许多不同的上下文中使用asynchronous框架,因此您可能希望在Web应用程序中使用asynchronous框架,原因很简单,因为您有现成的库代码,这些库代码是为使用您要使用的asynchronous框架的其他应用程序编写的。 或者您可能希望能够在一些假设的未来非Web应用程序中重新使用您的Web应用程序代码。 在这种情况下,它与使用Apache或Tomcat或其他function方面没有多大区别,它只是为您提供更一般的可重用的方式来组织您的程序。

事实上,基于事件的框架适用于你有很多io和更less的cpu操作,但是定义了大部分网页的情况,因为它们等待db。 其他的例子是youtube的聊天或video – 一个堆栈允许同时服务更多的客户端。 基于事件的服务器能够处理数十个或数百个连接的客户端,其中这样的线程数量会使机器停止工作。 当你需要做一些处理的时候,效率会降低。

每个连接没有堆栈。 每个处理器核心只有一个堆栈。 这并不是说它一次只能做一件事 – 为什么不等到有事忙于转换任务,而不是任意地来回移动呢?