Javascript NodeJ如何处理循环中相同函数的并行执行?
我在一个循环中运行相同的异步函数,而不用在一个有2个CPU的系统中等待该函数。当我从函数内部登录到进程id时,它们都具有相同的进程id 节点如何处理这种并行执行?这两个CPU都使用得很好吗?我是否需要为循环中的每个函数手动分叉进程Javascript NodeJ如何处理循环中相同函数的并行执行?,javascript,node.js,asynchronous,process,Javascript,Node.js,Asynchronous,Process,我在一个循环中运行相同的异步函数,而不用在一个有2个CPU的系统中等待该函数。当我从函数内部登录到进程id时,它们都具有相同的进程id 节点如何处理这种并行执行?这两个CPU都使用得很好吗?我是否需要为循环中的每个函数手动分叉进程 function next(){ console.log('main started', process.$ const arr=[]; for(let i=0; i<10000000; i++) arr.pus
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()
函数next(){
日志('main started',进程$
常数arr=[];
对于(设i=0;i您可以使用Promise.all
,从该异步函数返回解析数据。这样节点就不会等待处理每个数组项
let results = await Promise.all(
array.map(arrayItem => executeAsynchronousFunctionWith(arrayItem))
);
变量results
是解析结果的数组。您可以使用Promise。所有从该异步函数返回解析数据的。这样,节点就不会等待处理每个数组项
let results = await Promise.all(
array.map(arrayItem => executeAsynchronousFunctionWith(arrayItem))
);
变量results
是一个解析结果数组。Node.js在一个线程中运行实际的Javascript,因此它不会对实际的Javascript应用多个CPU,除非您专门设计代码以将CPU密集型任务放入或使用集群或子线程创建自己的单独进程进程模块启动您自己的附加进程,然后将工作分配给它们。只需运行node.js程序,这是一个CPU密集型操作(就像您的长循环排序)将占用CPU并阻止事件循环处理其他请求。它不会让其他CPU参与排序操作,也不会将其他CPU用于Javascript
当您运行异步操作时,该操作后面会有本机代码,并且本机代码可能使用也可能不使用其他线程或进程。例如,文件I/O使用线程池。网络使用本机操作系统异步支持(无线程)。spawn()
或exec()
在子进程中
启动新进程
如果您向我们展示您特定情况下的实际代码,我们可以更具体地回答该特定操作是如何工作的
节点如何处理这种并行执行
这取决于操作是什么
这两个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()
这取决于具体情况。用于将多个CPU应用于实际Javascript(非异步操作),则需要多个进程运行Javascript或最新的Worker thread api。如果并行性都在异步操作中,那么node.js的事件驱动特性尤其擅长同时管理多个异步操作,您甚至可能无法从涉及多个CPU中获益,因为大多数node.js所做的大部分时间都在等待I/O完成,并且node.js中的许多请求可以同时非常高效地执行
为了让多个CPU应用于Javascript本身的运行,node.js有一个专门为此而构建的集群进程。您可以为计算机中的每个实际CPU核心启动一个集群进程。或者,您也可以使用新的
另请参见以下讨论如何在node.js中处理CPU密集型代码的答案:
Node.js在一个线程中运行实际的Javascript,因此它不会对实际的Javascript应用多个CPU,除非您专门设计代码,将CPU密集型任务放入其中,或者使用集群创建自己的单独进程,或者使用子进程模块启动自己的其他进程,然后arm解决这些问题。只需运行node.js程序,CPU密集型操作(如长循环排序)将占用CPU并阻止事件循环处理其他请求。它不会让其他CPU参与排序操作,也不会将其他CPU用于Javascript
当您运行异步操作时,该操作后面会有本机代码,并且本机代码可能使用也可能不使用其他线程或进程。例如,文件I/O使用线程池。网络使用本机操作系统异步支持(无线程)。spawn()
或exec()
在子进程中
启动新进程
如果您向我们展示您特定情况下的实际代码,我们可以更具体地回答该特定操作是如何工作的
节点如何处理这种并行执行
这取决于操作是什么
这两个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()
这取决于具体情况。用于将多个CPU应用于实际Javascript(非异步操作),则需要多个进程运行Javascript或最新的Worker thread api。如果并行性都在异步操作中,那么node.js的事件驱动特性尤其擅长同时管理多个异步操作,您甚至可能无法从涉及多个CPU中获益,因为大多数node.js所做的大部分时间都在等待I/O完成,并且node.js中的许多请求可以同时非常高效地执行
为了让多个CPU应用于Javascript本身的运行,node.js有一个专门为此而构建的集群进程。您可以为计算机中的每个实际CPU核心启动一个集群进程。或者,您也可以使用新的
另请参见以下讨论如何在node.js中处理CPU密集型代码的答案:
这可能会有帮助:让我们看看你