【问题标题】:Understanding event loop with twisted and node了解带有扭曲和节点的事件循环
【发布时间】:2014-07-18 15:53:33
【问题描述】:

我正在尝试选择一个平台来编写我的网络应用程序,它将是一个小型实时在线游戏服务器。虽然我知道如何编写一些异步代码,但我对异步理论不是很熟悉。

我都知道javascript和python,在同一水平上。

所以我正在阅读扭曲的here,他说:

在回调期间,Twisted 循环在我们的 代码。所以我们应该确保我们的回调代码不会浪费任何时间。 特别是,我们应该避免在我们的 回调。否则,我们将失去使用的全部意义 首先是反应器模式。扭曲不会采取任何 防止我们的代码阻塞的特殊预防措施,我们只需要 确保不要这样做。正如我们最终将看到的,对于常见情况 我们不必担心网络 I/O,因为我们让 Twisted 做 我们的异步通信。

我想看看这与node.js 上的事件循环的完成方式有何不同。我相信node.js 实现了事件循环并且它永远不会阻塞,或者我错过了什么?

  • 我使用node.js 在回调中编写了一些阻塞代码,这是否意味着我犯了一个错误?

  • 为什么 twisted 仍然阻塞时称为异步和事件驱动?

干杯,
少校

【问题讨论】:

    标签: javascript python node.js asynchronous


    【解决方案1】:

    Twisted、node.js 和所有其他异步框架在这里的行为方式完全相同:如果您在回调中编写阻塞代码,整个事件循环将被阻塞,直到您的回调完成。

    异步框架非常适合做 I/O 密集型工作;事件循环在等待 I/O 时永远不会被阻塞,因为它都可以以非阻塞方式完成。当有数据可供读取时,事件循环触发您的回调,回调处理数据,然后事件循环再次获得控制权。当您听到这些框架被称为“异步”和“事件驱动”时,它指的是这种非阻塞 I/O + 事件循环模型。

    但是,当您确实需要对正在发送/接收的数据进行某种处理时,您需要小心。事件循环是单线程的;一次只能发生一个基于 CPU 的操作。这意味着,如果您在回调中执行一些耗时 10 秒的昂贵计算,您的事件循环将被阻塞 10 秒。 node.js 中没有额外的魔法可以避免这种情况。

    如果您希望能够在不阻塞事件循环的情况下执行基于 CPU 的操作,node.js(和 twisted)具有将 CPU 绑定的工作发送到子进程的机制,然后在子流程完成。 node.js About page 实际上提到了这一点:

    但是多处理器并发呢?不是线程 有必要将程序扩展到多核计算机吗?你可以开始新的 通过child_process.fork() 处理这些其他进程将是 并行安排。用于负载平衡传入连接 多个进程使用集群模块。

    【讨论】:

    • 这是迄今为止我看到的最好的解释。但我会尽量让答案的位置保持开放几个小时......我希望你不介意。但这些信息是我在任何地方都找不到的。
    • 您为我的用例(小型实时游戏服务器)提供的建议也非常好。谢谢你。希望也能看到更多关于这些的建议。
    • 如果我理解正确的话。使用事件循环只接收和发送数据,并使用另一个进程(子进程)来处理数据的解析和序列化,也许另一个进程(子进程)来处理接收数据的逻辑以及发送什么数据。
    • 只是为了支持我的观点,here's a blog post 关于 node.js 服务器的性能不佳,因为事件循环被一些 json 解析阻塞,花费的时间比预期的要长。
    • this information is something I haven't found anywhere。我没有怀疑你。我感谢你提供这样的信息,这是我在其他任何地方都找不到的。 :)
    猜你喜欢
    • 2014-12-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    相关资源
    最近更新 更多