Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js中的单线程是如何工作的?_Javascript_Node.js - Fatal编程技术网

Javascript Node.js中的单线程是如何工作的?

Javascript Node.js中的单线程是如何工作的?,javascript,node.js,Javascript,Node.js,我目前正在详细阅读Node.js在幕后的工作方式。我的问题是关于它的单线程架构和事件循环。我已经熟悉了其中的大部分,但有一件事让我感到困惑。一位在线讲师说,如果在顶级代码中调用一个重同步函数,那么调用它是可以的。我知道它甚至在事件循环启动之前就已经运行了,但它是否仍然会阻止其他用户,因为它是在单线程上运行的?作为服务器启动的一部分运行同步操作是很常见的,这完全可以。事实上,如果在服务器启动中不使用同步操作,那么启动代码可能要复杂得多 例如,require操作是同步和阻塞的。因此,在代码的服务器启

我目前正在详细阅读Node.js在幕后的工作方式。我的问题是关于它的单线程架构和事件循环。我已经熟悉了其中的大部分,但有一件事让我感到困惑。一位在线讲师说,如果在顶级代码中调用一个重同步函数,那么调用它是可以的。我知道它甚至在事件循环启动之前就已经运行了,但它是否仍然会阻止其他用户,因为它是在单线程上运行的?

作为服务器启动的一部分运行同步操作是很常见的,这完全可以。事实上,如果在服务器启动中不使用同步操作,那么启动代码可能要复杂得多

例如,require操作是同步和阻塞的。因此,在代码的服务器启动部分使用同步代码是完全可以的

但是,一旦服务器启动,在任何类型的请求处理程序中使用同步I/O代码(如fs.readFileSync)都会破坏服务器的可伸缩性

我知道它甚至在事件循环开始之前就运行了,但它是否仍然会阻止其他用户,因为它是在单个线程上运行的

如果同步代码在服务器开始服务请求之前,则没有其他用户需要阻止。这只是让服务器运行的代码的一部分


如果同步代码是在服务器开始为请求提供服务之后,那么是的,它将在同步代码运行时阻止处理其他请求,这将是一件不可取的事情,因为它将显著降低服务器的可伸缩性和响应能力。

@RokoC.Buljan我知道这一点。我的问题是关于在事件循环开始之前运行的同步函数。@RokoC.Buljan您的说法有误导性。Node.js将线程用于IO或Worker。js上的上下文始终是单线程的,因此一个js上下文的异步函数将在同一线程中运行。无论何时执行js代码块。如果它是阻塞的,它将阻塞整个上下文。工作线程或IO仍可在单独的线程中运行,但阻止代码块所属的上下文被阻止。@t.niese:Node.js仅使用线程进行磁盘I/O和DNS查找。它将主线程用于所有其他I/O,如网络I/O