小编典典

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

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,如何使代码无阻塞?

我希望在事件循环的每个周期中进行尽可能少的计算,以便可以同时为尽可能多的客户端提供服务。

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

当我拥有非阻塞代码时,如何在多个进程之间扩展代码?

一种选择是等待WebWorker子流程API完成。


阅读 233

收藏
2020-07-07

共1个答案

小编典典

JavaScript是单线程的。这意味着无论事件,超时或使用nextTick延迟,完成的任何计算都会阻塞整个过程。

如果您使用来分步处理process.nextTick,就像setTimeout(fn, 0)在客户端上那样,以避免阻塞UI,则可以将工作量分散在更长的时间范围内,从而为其他功能的运行留出了空间。

但这是一个非常无效的解决方案-
总的工作量是相同的,分布在所有周期中(使每个请求的速度稍慢一些)。在实践中,任何预计需要花费数毫秒以上时间的计算都应分流到其他进程。为了最大化并发性,您应该
始终尽可能快地返回事件循环

child_process.fork()是几天前添加到v0.5的。它简化了子流程的创建和通信-不完全是Web
Workers的API,而是关闭的,请参阅URL

https://github.com/joyent/node/blob/master/doc/api/child_process.markdown

2020-07-07