繁体   English   中英

Node.js性能事件循环

[英]Nodejs performance event loop

文章声称由于其单线程事件循环而具有出色的nodejs性能。 我不是要征求意见,而是要提供力学解释

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

  • A1回答“还不知道”?
  • A2是否有其他要求?

A1对我来说毫无意义。 我可以想象一个客户端在此期间发出其他请求(例如在首次访问站点时加载多个资源),但总的来说没有。

A2当它获取另一个请求时,它将失去整个上下文。 该上下文保存在promise中,当数据到达时,promise将被实现,但是处理该promise的线程是什么?

  • B1以后相同的线程
  • B2不同的线程。

在B1的情况下,您可能很幸运,并且某些相关数据可能仍在线程的缓存中,但是考虑到DB请求需要花费几毫秒的时间,因此收益是恕我直言的低。

案例B2实际上不等于上下文切换吗?

答:Node.js将不会响应任何请求,除非您编写主动发送响应的代码。 该代码是同步运行还是异步运行都没有关系。
客户端(甚至服务器的网络堆栈)无法知道或不在乎同步是否同时发生。

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

Node.js基于libuv C库。

在内部使用线程来伪造所有系统调用的异步特性。 libuv还使用线程允许应用程序异步执行实际上正在阻塞的任务,方法是生成线程并在完成时收集结果。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM