Node.js阻止自然

时间:2012-11-09 17:01:41

标签: javascript node.js google-chrome v8

这是关注我之前的问题Node.js Non Blocking Nature。  我仍然感觉不到我完全理解Node.js正在发生的事情。让我们说Node收到了一个用户上传大文件的请求。现在我们说我们把代码放在回调中处理文件,从而使它异步。接下来发生什么 ?让我们说回调被放入Node.js应用程序需要处理的大量事件列表中,所以到目前为止它并没有阻塞。但是在某些时候,回调会从事件循环中拉出来并且它的代码开始运行(上传或下载文件,无论如何)。现在怎么办 ? Node.js应用程序现在被阻止吗?如果是这样 - 它如何不破坏应用程序的性能,如果不是 - 谁负责在不同的事件和请求之间“跳跃”?我们知道在apache或类似服务器中有特殊代码来处理所有线程(对它们进行计时),这样就没有线程会阻塞所有其他线程。但是,在Node中,我知道,有一个事件循环。当文件I \ O完成时,它的回调会神奇地返回ready文件。尽管如此,服务器仍然必须做I \ O,没有逃避!事件循环中的代码是否正在计时?例如,在不同事件之间跳转(callbacks..whatever),以便没有请求扼杀另一个事件?如果是这样,以什么方式?

3 个答案:

答案 0 :(得分:9)

所有I / O都由node.js使用多个线程在内部处理;它是I / O功能的编程接口,它是单线程,基于事件和异步的。

因此,您的示例的大上传由一个由node.js管理的单独线程执行,当该线程完成其工作时,您的回调将被放入事件队列(由单个JavaScript线程执行)。

将单个JavaScript线程视为拉回队列头部的回调并连续执行它们直到队列为空。然后它会一直休眠,直到其中一个内部I / O线程在队列中放入一个新的回调。

This article讨论process.nextTick的相关主题,帮助我了解其中的一些细节。

答案 1 :(得分:3)

虽然node.js通常被描述为“非阻塞”,但这实际上意味着它不会阻止i / o 上的 。如果它必须做处理器密集的事情,当然,其他事情必须等待。但如果只是等待从文件系统或网络返回数据,节点将不会阻止您的进程。

在文件上传缓慢的情况下,它正在处理,当数据进入时,它会定期执行某些操作(可能会调用您的回调,但可能只是存储该数据,直到它足以调用您的回调) 。但计算机速度很快,无论发生什么,无论出于何种意图和目的,都是即时的。事实上,我们关注的网络运营相对较慢。在像Php这样的语言中,通常,在此操作完成之前,您的函数将不会返回,并且在该脚本中您无法执行任何其他操作,直到发生这种情况。与此同时,CPU可能处于空闲状态......只需等待数据通过网络进入。另一方面,节点让你在调用回调之前将CPU用于其他事情。

正如其他人所指出的那样,可能会有一些线索在幕后发生。或者可能没有,因为节点可以使用非阻塞C ++函数在内部实现文件和网络操作。无所谓。重要的是,i / o操作不会阻止您的应用程序中发生其他事情。

答案 2 :(得分:1)

我认为这个主题足够复杂(至少对于新手来说)值得彻底阅读,并且通过阅读5行答案无法理解。这是我找到的http://www.theserverside.com/discussions/thread.tss?thread_id=61693最好的资源。他对Node.js并不那么认真,但他确实需要付出很多努力来解释它。值得一读。在我看来。