Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Node.js中编写非阻塞代码?_Javascript_Node.js_Blocking_Eventemitter - Fatal编程技术网

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

Javascript 如何在Node.js中编写非阻塞代码?,javascript,node.js,blocking,eventemitter,Javascript,Node.js,Blocking,Eventemitter,我可以很容易地写非阻塞。这就是整个图书馆的目的 但任何计算都是阻塞的。任何传递过来的信息 例如,发出事件会立即解决,因此会阻塞: var e = new process.EventEmitter; e.on("foo", function() { console.log("event"); }); process.nextTick(function() { console.log("next tick"); }); setTimeout(function() { cons

我可以很容易地写非阻塞。这就是整个图书馆的目的

但任何计算都是阻塞的。任何传递过来的信息

例如,发出事件会立即解决,因此会阻塞:

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完成。

JavaScript中没有真正的多线程,这就是使调用无阻塞所需的。我唯一能想到的就是网络工作者:

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

如果您使用
process.nextTick
将处理分步骤进行,就像在客户端使用
setTimeout(fn,0)
来避免阻塞UI一样,您可以将工作负载分散在更长的时间跨度上,为其他功能的运行提供一些空间

但这是一个非常不理想的解决方案-总工作量是相同的,分布在所有周期中(使每个请求稍微慢一点)。在实践中,任何一种预计需要几毫秒以上时间的计算都应该卸载到另一个进程。为了最大化并发性,您应该总是尽快返回事件循环

child\u process.fork()
几天前被添加到v0.5中。它简化了子进程的创建和通信——不完全是WebWorkers API,但请参见
.

首先,90%的“问题”实际上不是问题,更多的是节点事件库的问题,这应该作为功能请求或github上的一个可能错误提出,至于你的小问题,我会专门针对这个主题提出一个问题,而不是把它压缩在这个问题上。@RobertPitt谢谢你指出这个问题措辞不当。我已经调整好了。我可能也会在github上提到它。谢谢,这稍微好一点。再说一次,我已经好几年没有用JS编程了,所以我可能错了。对
进程的回调。nextTick
是非阻塞的。您可以使用事件循环来编写非阻塞代码,但事件发射器不使用事件循环。我不知道如何利用事件循环。这正是我在代码片段中展示的。事件处理正在阻塞。我的问题是如何进行非阻塞消息传递以优化并发性?我想调用process.nextTick是最好的方法。@ricardotasi使用
process.nextTick
是非阻塞的,因为它允许其他任务获得CPU时间。基本上,只需将一个CPU拼接成多线程就可以了。Javascript仍然是单线程的,无论函数的位置如何,它们都会“阻塞”。其他任务也会阻塞,您只需切换它们的顺序。如果您将处理分步骤进行,就像在客户端完成以避免阻塞UI一样,您可以在更长的时间内分散相同数量的工作—这样您可能会获得更好的并发性,但作为交换,响应时间更长。这不是node.js的目的。非阻塞代码的好处来自于不坐着等待响应,而不是避免所有的计算。@Ricardomasi最后的评论确实总结了我的误解。如果你能修改答案来解释我的误解,我会接受的it@Raynos编辑。另外还提到了新的
.fork()
API,您应该看看它。