我可以很轻松地在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,如何使代码无阻塞?
nextTick
我希望在事件循环的每个周期中进行尽可能少的计算,以便可以同时为尽可能多的客户端提供服务。
如何以非阻塞方式编写代码?
当我拥有非阻塞代码时,如何在多个进程之间扩展代码?
一种选择是等待WebWorker子流程API完成。
JavaScript是单线程的。这意味着无论事件,超时或使用nextTick延迟,完成的任何计算都会阻塞整个过程。
如果您使用来分步处理process.nextTick,就像setTimeout(fn, 0)在客户端上那样,以避免阻塞UI,则可以将工作量分散在更长的时间范围内,从而为其他功能的运行留出了空间。
process.nextTick
setTimeout(fn, 0)
但这是一个非常无效的解决方案- 总的工作量是相同的,分布在所有周期中(使每个请求的速度稍慢一些)。在实践中,任何预计需要花费数毫秒以上时间的计算都应分流到其他进程。为了最大化并发性,您应该 始终尽可能快地返回事件循环 。
child_process.fork()是几天前添加到v0.5的。它简化了子流程的创建和通信-不完全是Web Workers的API,而是关闭的,请参阅URL https://github.com/joyent/node/blob/master/doc/api/child_process.markdown。
child_process.fork()