了解扭曲和节点的事件循环

时间:2014-07-18 15:53:34

标签: javascript python node.js asynchronous

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

我在同一级别都知道javascript和python。

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

  

在回调期间,Twisted循环在我们的网站上被有效“阻止”   码。所以我们应该确保我们的回调代码不会浪费任何时间。   特别是,我们应该避免在我们的中进行阻塞I / O调用   回调。否则,我们将打败整个使用点   首先是反应堆模式。扭曲不会采取任何   防止我们的代码阻塞的特殊预防措施,我们只需要   一定不要这样做。正如我们最终将看到的那样,对于常见情况   网络I / O我们不必担心它,因为我们让Twisted做   我们的异步通信。

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

  • 我在node.js的回调中写了一些阻止代码,这是否意味着我犯了错误?

  • 为什么在它仍然阻塞的情况下被称为异步和事件驱动?

干杯,
少将

1 个答案:

答案 0 :(得分: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()进程   并行安排。用于负载平衡传入连接   多个进程使用集群模块。