考虑以下服务器端nodejs代码。假设循环内部的代码是原子的(代码应该执行一次)并且迭代之间没有依赖...
for (var i=0; i<aVeryLargeValue; i++){
//do atomic complex calculations
}
有没有办法通过将循环划分为多个部分来提高服务器性能,以便异步执行迭代?
答案 0 :(得分:2)
您的问题似乎是aVeryLargeValue
导致服务器处理此循环花费太长时间,从而阻止了其他请求。
使用async
模块处理此问题。您可以使用whilst
函数将循环分解为多个部分。
var async = require('async');
var aVeryLargeValue=99999;
var i=0;
async.whilst(
function() { return i < aVeryLargeValue; },
function(callback) {
for(x=i;x<i+1000;x++) {
//do something
}
i+=1000;
callback();
},
function(err) {
if(err) throw err;
}
);
如果这是CPU密集型的东西,那么最好使用子进程来处理它。上面的代码主要适用于需要处理大量请求的时间,这可能需要几秒钟,但您不想在几秒钟内保留其余的请求。如果您的处理时间超过几秒钟,那么您应将其卸载到子进程。
答案 1 :(得分:1)
当然,您可以根据需要将循环拆分为多个部分,但由于开销,摘要执行时间会更糟。
据我所知,没有办法在JavaScript中运行并行循环(分别是node.js)。