如何在Node.js中编写非阻塞代码?

我可以非常容易地在Node.js中编写非阻塞I / O。 这是整个图书馆的设置。

但是任何计算都是阻塞的。 通过事件发射器传递的任何消息都被阻塞 。

例如,发射事件立即被解决,因此被阻塞:

var e = new process.EventEmitter; e.on("foo", function() { console.log("event"); }); process.nextTick(function() { console.log("next tick"); }); setTimeout(function() { console.log("timeout"); }, 0); e.emit("foo"); > event > next tick > timeout 

除了在nextTick包装调用,我如何使代码非阻塞?

我希望在事件循环的每个循环中尽可能less地进行计算,以便尽可能多地同时服务于客户端。

如何以非阻塞的方式编写我的代码?

而当我有非阻塞代码,我怎么扩大跨多个进程?

一种select是等待WebWorker子stream程API完成。

JavaScript是单线程的。 这意味着无论事件,超时,还是使用nextTick延迟,所做的任何计算都将阻止整个过程。

如果使用process.nextTick分步执行process.nextTick ,就像在客户端使用setTimeout(fn, 0)完成一样,以避免阻塞用户界面,则可以将工作量分散到更长的时间间隔,为其他function留出空间跑步。

但这是一个非常有效的解决scheme – 工作总量是相同的,分布在所有周期中(使每个请求的速度稍慢)。 在实践中,任何预计需要超过几毫秒的计算都应该被卸载到不同的进程。 要最大化并发性,应该尽可能快地返回到事件循环

child_process.fork()被添加到v0.5。 它简化了subprocess的创build和通信 – 不是Web工作者API,而是closures,请参阅URL https://github.com/joyent/node/blob/master/doc/api/child_process.markdown

在JavaScript中没有真正的multithreading,这就是你所需要的非阻塞的呼叫。 我唯一能想到的就是networking工作者: https : //developer.mozilla.org/en/Using_web_workers