Node.js是否委托多线程?

Node.js是否委托多线程?,node.js,express,fs,Node.js,Express,Fs,我有一个带有REST端点的express服务器的示例代码,该端点执行fs.readFile操作。 我知道该操作是异步的,不会阻塞作为单线程进程运行的主线程。 但是我想澄清一下,当有数百个对Node.js服务器的请求,并且请求在I/O中排队时会发生什么情况。这里是否存在在I/O级别后台进行的文件读取操作的多线程处理?或者这也只是一个单线程操作?如果是这样的话,这不是大量请求的瓶颈吗?评论中的cloudburst.io链接是一个非常深入的解释 简短的版本是,节点进程本身是单线程的,但它依赖操作系统来

我有一个带有REST端点的express服务器的示例代码,该端点执行fs.readFile操作。 我知道该操作是异步的,不会阻塞作为单线程进程运行的主线程。
但是我想澄清一下,当有数百个对Node.js服务器的请求,并且请求在I/O中排队时会发生什么情况。这里是否存在在I/O级别后台进行的文件读取操作的多线程处理?或者这也只是一个单线程操作?如果是这样的话,这不是大量请求的瓶颈吗?

评论中的cloudburst.io链接是一个非常深入的解释

简短的版本是,节点进程本身是单线程的,但它依赖操作系统来处理I/O任务和类似任务,并使用文件句柄跟踪挂起的回调


这意味着你的问题的答案是“或多或少”,因为它假设操作系统具有支持功能。大多数都是这样,所以这是一个安全的赌注,但并非所有的IO操作都能保证

评论中的cloudburst.io链接是一个非常深入的解释

简短的版本是,节点进程本身是单线程的,但它依赖操作系统来处理I/O任务和类似任务,并使用文件句柄跟踪挂起的回调


这意味着你的问题的答案是“或多或少”,因为它假设操作系统具有支持功能。大多数都是这样,所以这是一个安全的赌注,但并非所有的IO操作都能保证

node.js中的文件I/O使用线程池(用于与文件操作关联的本机代码)。有一个用于挂起文件I/O操作的队列,线程池中的每个线程从队列中获取一个事件,处理它,完成它,触发完成事件,然后从队列中获取下一个挂起文件I/O操作并处理它

从Javascript的角度来看,这都是非阻塞的。当您调用其中一个异步文件操作时,它将传递给文件I/O子系统,并立即将控制权返回给JS引擎以运行其他JS。稍后,当内部系统完成文件I/O操作,事件被添加到node.js事件队列中,当此时正在运行的js完成并到达node.js事件队列中的下一个事件时,然后调用与完成该异步文件操作相关联的回调,并运行与其相关联的JS

我有一个express服务器的示例代码,该服务器具有执行fs.readFile操作的REST端点。我知道该操作是异步的,不会阻塞作为单线程进程运行的主线程

这是正确的

但是我想澄清一下,当有数百个对Node.js服务器的请求,并且请求在I/O中排队时会发生什么情况。这里是否存在在I/O级别后台进行的文件读取操作的多线程处理

数百个请求将堆积在内部文件I/O队列中,它们将由用于文件I/O的内部本机代码的线程池中的N个线程一次处理N个请求

或者这也只是一个单线程操作?如果是这样的话,它是否会成为大量请求的瓶颈

一次有N个线程(线程池中的线程数)。是的,这将是一个瓶颈。无论如何编程,同时执行数百个文件请求总是会成为某种瓶颈,因为在最低级别,磁盘一次只能查找一个位置,一次只能读取磁盘的一部分。node.js中线程池的大小是可控的,但是如果所有磁盘I/O请求都指向同一个底层磁盘,那么通过添加更多线程(这些线程都在争夺磁盘上的同一读/写磁头)将无法获得效率

如果您希望进一步了解node.js事件循环和其他子系统的工作原理,那么有很多关于该主题的有用文章:


node.js中的文件I/O使用线程池(用于与文件操作关联的本机代码)。有一个用于挂起文件I/O操作的队列,线程池中的每个线程从队列中获取一个事件,处理它,完成它,触发完成事件,然后从队列中获取下一个挂起文件I/O操作并处理它

从Javascript的角度来看,这都是非阻塞的。当您调用其中一个异步文件操作时,它将传递给文件I/O子系统,并立即将控制权返回给JS引擎以运行其他JS。稍后,当内部系统完成文件I/O操作,事件被添加到node.js事件队列中,当此时正在运行的js完成并到达node.js事件队列中的下一个事件时,然后调用与完成该异步文件操作相关联的回调,并运行与其相关联的JS

我有一个express服务器的示例代码,该服务器具有执行fs.readFile操作的REST端点。我知道该操作是异步的,不会阻塞作为单线程进程运行的主线程

这是正确的

但是我想澄清一下,当有数百个对Node.js服务器的请求,并且请求在I/O中排队时会发生什么情况。这里是否存在在I/O级别后台进行的文件读取操作的多线程处理

数百个请求将堆积在内部文件I/O队列中,它们将由用于文件I/O的内部本机代码的线程池中的N个线程一次处理N个请求

或者这也只是一个单线程操作?如果是这样的话,它是否会成为大量请求的瓶颈

是N thr