Nodejs性能事件循环

Nodejs performance event loop

本文关键字:循环 事件 性能 Nodejs      更新时间:2023-09-26

有文章声称nodejs的单线程事件循环具有卓越的性能我不是在征求意见,我是在征求力学解释

线程开始处理一个请求,计算一点,然后发现它需要从数据库中读取。这是异步完成的。不涉及延迟,线程可以继续。。。但如果没有这些数据,它该怎么办?

  • A1回答"还不知道"
  • A2获取另一个请求

A1对我来说没有什么意义。我可以想象客户端同时发出其他请求(比如在第一个站点访问时加载多个资源),但总的来说,没有。

A2当它获取另一个请求时,就会丢失整个上下文。这个上下文保存在promise中,当数据到达时,promise将被实现,但哪个线程处理这个promise?

  • B1以后的线程相同
  • B2不同的螺纹

在B1的情况下,你可能很幸运,一些相关数据可能仍在线程的缓存中,但考虑到DB请求需要几毫秒的时间,收益很低。

情况B2实际上不是等同于上下文切换吗?

A:Node.js不会响应任何请求,除非您编写了主动发送响应的代码。代码是同步运行还是异步运行并不重要
客户端(甚至服务器的网络堆栈)无法知道或关心在此期间是否发生了异步。

B: 只有一个Node.js线程,句点
当Node.js代码中启动的异步操作的响应到达时,Node.js事件循环线程中会引发一个事件,并调用相应的回调/处理程序。

Node.js基于libuv C库。

线程在内部用来伪造所有系统调用。libuv还使用线程,要异步执行实际上正在阻塞的任务,请通过生成一个线程并在完成后收集结果。

线程开始处理一个请求,进行一些计算,并发现它需要从数据库中读取。这是异步完成的。不涉及延迟,线程可以继续。。。但如果没有这些数据,它该怎么办

将回调传递给DB模块的方法,并从作为事件侦听器调用的当前函数返回。事件循环将继续到队列中的下一个事件。上下文可以作为函数的闭包在回调中访问。