【问题标题】:What is the point/purpose of Ruby EventMachine, Python Twisted, or JavaScript Node.js?Ruby EventMachine、Python Twisted 或 JavaScript Node.js 的意义/目的是什么?
【发布时间】:2011-02-25 09:23:29
【问题描述】:

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

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

【问题讨论】:

    标签: twisted nonblocking node.js eventmachine


    【解决方案1】:

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

    【讨论】:

    • 我认为等待其他事情会占用大量时间,但是如果特定页面正在进行大量处理并且需要大约 500 毫秒才能完成,那又如何呢?这意味着它开始和结束之间的所有其他请求都必须等待 1/2 秒才能开始。我正在考虑一个脚本,它对无法以已经编译的方式检索的事物进行大量数字运算,即大量 CPU、少量 I/O。
    • @CCw:不,它不会,至少在 node.js 中,您为该进程设置了一个事件并在它完成时获得回调(简而言之),而脚本的其余部分继续以异步方式工作并为请求提供服务。您所描述的是相反的“同步”方法。
    • 确实,每页执行 500 毫秒计算的任务将需要大量 CPU 才能获得并发性——或者应该将其作为后台任务进行分割,并通过事件完成。大多数网络系统在运行许多此类事情时都犹豫不决——有很多堆栈挂在身边,线程被切换,没有人能做很多事情。异步编程迫使人们隔离那些表现不佳的代码,并将系统视为一个整体。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      例如,如果您要编写a massively multiplayer video game,“设置一个Java 程序......为每个请求分派一个线程”可能不是一个选项;处理这么多线程非常复杂,而且性能也很差。更不用说“只产生一堆线程”缺少 Twisted 等的一堆管理工具这一事实。人。有,比如twistd,它处理日志记录、守护进程、启动和关闭等等。

      或者,如果您想编写build automation systemasynchronously invoke and control subprocesses 的功能会很有用。如果您异步生成一个进程,您可以轻松地终止该进程并优雅地处理它的退出。如果您通过启动一个线程并在该线程中阻塞来生成它,您将无法轻易停止它,因为stopping a thread is inherently unsafe

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-28
        • 1970-01-01
        • 1970-01-01
        • 2011-09-20
        • 2011-04-18
        • 2016-09-17
        • 2021-11-10
        • 2011-01-11
        相关资源
        最近更新 更多