我可以允许在与循环node.js“rest”?

我有一个巨大的for循环,我想在我正在处理时允许I / O继续。 也许每隔一万次左右迭代。 任何方式让我允许这样的额外的I / O?

一个巨大的循环就是阻止整个服务器。

你有两个select,把for循环放在一个新的线程中,或者使它成为asynchronous的。

 var data = []; var next = function(i) { // do thing with data [i]; process.nextTick(next.bind(this, i + 1)); }; process.nextTick(next.bind(this, 0)); 

我不推荐后者。 你只是实施无用的时间拼接,操作系统级进程调度程序可以做得更好,然后你。

 var exec = require("child_process").exec var s = exec("node " + filename, function (err, stdout, stderr) { stdout.on("data", function() { // handle data }); }); 

或者使用像hook.io这样的东西为你pipe理进程。

其实你可能想积极地重新devise你的代码库,如果你有一个阻塞循环。

也许像这样把你的循环分成几块

代替:

 for (var i=0; i<len; i++) { doSomething(i); } 

就像是:

 var i = 0, limit; while (i < len) { limit = (i+10000); if (limit > len) limit = len; process.nextTick(function(){ for (; i<limit; i++) { doSomething(i); } }); } } 

nextTick()调用为其他事件提供了一个机会,但是它仍然会同步执行大部分循环(我猜测)会比创build每个迭代的新事件快得多。 显然,你可以用数字(10,000)进行试验,直到你得到你想要的结果。

理论上,你也可以使用setTimeout()而不是nextTick(),以防万一给其他进程一个更大的“时间片”有帮助。 这给了你一个可用于调整的variables(超时毫秒)。