我可以允许在与循环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(超时毫秒)。