NodeJS 如何处理循环中相同函数的并行执行?



我在循环中运行相同的异步函数,而无需在具有 2 个 CPU 的系统中等待该函数。当我从函数内部登录到进程 ID 时,它们都具有相同的进程 ID,

Node 如何处理此类并行执行?两个 CPU 都使用完美吗?我是否需要为循环中的每个函数手动分叉进程?


function next(){
console.log('main started', process.$
const arr=[];
for(let i=0; i<10000000; i++)    
arr.push(1);
arr.sort(function(a, b){return a<b});
console.log('main ended')
}
function main(){
next();
next()
next();
next();
next();
next();
console.log('-----------------------------$
}
main()

霍托普 截图

Node.js在单个线程中运行实际的Javascript,因此它不会将多个CPU应用于实际的Javascript,除非您专门设计代码以将CPU密集型任务放在工作线程中,或者使用集群或使用child_process模块创建自己的单独进程,以启动自己的其他进程,然后将农场工作交给它们。 只需运行节点.js程序,CPU 密集型操作(如排序的长循环(就会占用 CPU 并阻止事件循环处理其他请求。 它不会涉及其他CPU来执行该排序操作,也不会将其他CPU用于Javascript。

运行异步操作时,该操作后面会有本机代码,并且本机代码可能会也可能不会使用其他线程或进程。 例如,文件 I/O 使用线程池。 网络使用本机操作系统异步支持(无线程(。spawn()exec()child_process启动新流程。

如果您向我们展示适合您具体情况的实际代码,我们可以更具体地回答该特定操作的工作原理。

Node 如何处理此类并行执行?

这取决于操作是什么。

两个 CPU 都使用完美吗?

可能不是,但我们需要查看您的特定代码。

我是否需要为循环中的每个函数手动分叉进程?

这取决于具体情况。 为了将多个CPU应用于实际的Javascript(不是异步操作(,则需要多个进程运行Javascript或最新的Worker thread api。 如果并行性全部在异步操作中,那么node.js的事件驱动性质特别擅长同时管理许多异步操作,您甚至可能无法从涉及多个CPU中受益,因为大多数时候所有节点正在执行.js正在等待I/O完成,并且许多许多请求已经在node.js中非常有效地同时运行。

为了实际应用多个CPU来运行Javascript本身,node.js具有专门为此构建的集群模块。 您可以为计算机中的每个实际 CPU 内核启动群集进程。 或者,您也可以使用新的工作线程 API。

另请参阅这些答案,这些答案讨论了如何在节点.js中处理 CPU 密集型代码:

如何在nodejs中处理大量的对象

如何将聚类/生成子进程技术应用于具有 bouth IO 绑定和 CPU 绑定任务的 Node.js应用程序?

节点.js socket.io 服务器长延迟

是否可以以某种方式在 NodeJS 中进行多线程处理?

对于节点来说,CPU 密集型程度.js太多(担心阻塞事件循环(

您可以使用从此异步函数返回解析数据的Promise.all。这样节点就不会等待每个数组项被处理。

let results = await Promise.all(
array.map(arrayItem => executeAsynchronousFunctionWith(arrayItem))
);

变量results是已解决结果的数组。

最新更新