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

要回复问题请先登录注册