Javascript Node.js阻塞性质

Javascript Node.js阻塞性质,javascript,node.js,google-chrome,v8,Javascript,Node.js,Google Chrome,V8,这是我前面的问题。 我仍然不能完全理解Node.js的情况。假设Node收到了一个用户上传大文件的请求。现在我们说,我们将处理文件的代码放在回调中,从而使其异步。接下来会发生什么?假设回调被放入Node.js应用程序需要处理的大量事件列表中,到目前为止它还没有阻塞。但是在某个时刻,回调从事件循环中被拉出,它的代码开始运行(上传或下载文件,等等)。现在怎么办?Node.js应用程序现在被阻止了吗?如果是的话——它如何不破坏应用程序的性能,如果不是的话——谁负责在不同的事件和请求之间“跳跃”?我们知

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

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

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

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


讨论了
process.nextTick
的相关主题,这有助于我理解其中的一些细节。

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

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


正如其他人所指出的,发动机罩下可能有螺纹。或者可能不存在,因为节点可以使用非阻塞C++函数在内部实现文件和网络操作。没关系。重要的是,i/o操作不会阻止应用程序中发生其他事情。

我认为这个问题足够复杂(至少对新手而言),值得仔细阅读,并且不能通过阅读5行答案来理解。这是我找到的最好的资源。他对Node.js评价不高,但他确实花了很多精力来解释它。在我看来值得一读。

你有没有试过建立一个小测试系统来看看它的功能?你会使用什么API来处理上传的文件?没有API,也没有测试系统,伙计们,这纯粹是一个noob的问题,试图理解事件是如何处理的。@user1032663好吧,Node.js为这个任务提供了什么API。我这样问是为了查阅文档,了解它的行为。@user1032663我也在想同样的事情。你能详细说明一下吗?apache和这个有什么区别?在apache中,每个请求一个线程。这里-每个回调一个线程?这是如何提高性能的?@user1032663在apache中,每个请求处理程序都在自己的线程上执行,在node.js中,所有请求处理程序都在同一个线程上执行。那么您认为每个node.js callback\event都会打开一个新线程吗?@user1032663不,只有一个JavaScript线程执行所有回调。想象一下,线程将回调从队列头上拉下来,并连续执行它们,直到队列为空。然后它休眠,直到其中一个内部I/O线程在队列上放置新的回调。是否有单个线程,还是“内部”有多个线程,取决于操作系统。如果底层操作系统没有更好的解决方案,Node.js将使用线程来完成异步I/O。当然,对于在节点上运行的JavaScript程序来说,它始终是单线程的。看见