当前位置: 首页 > 面试题库 >

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

湛文乐
2023-03-14
问题内容

我可以很轻松地在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完成。


问题答案:

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。



 类似资料:
  • 如另一个问题中所述,当使用Undertow时,所有处理都应该在专用的工作线程池中完成,如下所示: 我知道可用于显式地告诉Undertow在专用的线程池中调度请求以阻止请求。我们可以通过将包装在实例中来修改上面的示例,如下所示: 调用此方法将exchange置于阻塞模式,并创建一个BlockingHttpExchange对象来存储流。当交换处于阻塞模式时,输入流方法变得可用,除了阻塞和非阻塞模式之间

  • 问题内容: 为什么有人会喜欢阻止写而不是非阻止写?我的理解是,仅当您想确保写方法返回后,另一端获得了TCP数据包时,才希望阻止写操作,但是我什至不知道这是可能的。您将必须刷新,而刷新则必须刷新 底层操作系统的写套接字缓冲区 。那么,无阻塞套接字写是否有任何缺点?就性能而言,拥有较大的底层写套接字是否会缓冲一个不好的主意?我的理解是,底层套接字写缓冲区越小,当底层套接字缓冲区已满且isWritabl

  • Java Future对象用于获取由并行线程(执行器)执行的异步计算的结果。我们调用Future.get()方法并等待结果就绪。此示例显示了一种从Future检索结果的非阻塞方式。java实现java非阻塞未来。 在本例中,在并行执行完成后调用onSuccess()方法。问题在于onSuccess()方法未在主线程上运行。我想在主线程上执行onSuccess()方法。我怎样才能解决这个问题。谢谢

  • 本文向大家介绍node.js回调函数之阻塞调用与非阻塞调用,包括了node.js回调函数之阻塞调用与非阻塞调用的使用技巧和注意事项,需要的朋友参考一下 首先,node.js作为javascript运行平台,它采用了事件驱动和异步编程的方式,通过事件注册和异步函数,开发人员可以提高资源利用率,服务器的性能也能得到改善。其次,对于前端人来说,node.js作为js的运行平台,我们可以通过编写系统级或者

  • 非阻塞 IO 仅对在 Servlet 和 Filter(2.3.3.3节定义的,“异步处理”)中的异步请求处理和升级处理(2.3.3.5节定义的,“升级处理”)有效。否则,当调用 ServletInputStream.setReadListener 或ServletOutputStream.setWriteListener 方法时将抛出IllegalStateException。为了支持在 Ser

  • Web 容器中的非阻塞请求处理有助于提高对改善 Web 容器可扩展性不断增加的需求,增加 Web 容器可同时处理请求的连接数量。servlet 容器的非阻塞 IO 允许开发人员在数据可用时读取数据或在数据可写时写数据。非阻塞 IO 仅对在 Servlet 和 Filter(2.3.3.3节定义的,“异步处理”)中的异步请求处理和升级处理(2.3.3.5节定义的,“升级处理”)有效。否则,当调用 S