Nodejs性能事件循环

时间:2014-09-28 02:39:12

标签: java javascript multithreading node.js

由于其单线程事件循环,性能有articles claiming superior nodejs我不是在征求意见,我正在寻求机制解释

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

  • A1回答“还不知道”?
  • A2抓住另一个请求?
A1对我来说没什么意义。我可以想象一个客户端在此期间发出其他请求(比如在第一次站点访问时加载多个资源),但总的来说,没有。

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

  • B1稍后同一个帖子
  • B2一个不同的主题。

如果是B1,你可能很幸运,一些相关数据可能仍在线程的缓存中,但鉴于数据库请求需要几毫秒,增益为恕我直言。

案例B2是否实际上等同于上下文切换?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

Node.js基于libuv C库。

  

内部使用线程来伪造所有的异步性质   系统调用。 libuv也使用线程来允许你,应用程序,   以异步方式执行实际阻塞的任务   产生一个线程并在结束时收集结果。

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

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