在Node.js事件循环中 - 将回调说i / o事件说'收到新的HTTP请求'在' I / O回调中执行'阶段OR'民意调查'相

时间:2017-04-15 14:46:34

标签: node.js event-loop

我发现事件循环通常在每次迭代中逐步完成以下循环:定时器 - > I / O回调 - >空闲 - >民意调查 - >检查 - >关 根据官方Node.js文档https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/

现在它还说'I / O Callbacks'阶段执行一些系统操作的回调,例如TCP错误的类型'例如TCP连接错误等典型操作。

并在'民意调查中阶段 - 它说'检索新的I / O事件' 。像传入的连接,数据等

我很困惑。在哪个阶段是I / O事件(回调处理程序),例如“接收到的新HTTP请求”,“按照先前的查询从数据库接收的数据”'被执行了吗?

2 个答案:

答案 0 :(得分:1)

一般

通常,您不应该关心这些阶段。甚至微任务(如nextTick)和macrotask(如setImmediate)之间的区别对于每天NodeJS开发人员来说都不是很重要。那篇文章深入探讨了Node如何在内部处理事物

用户通常需要关心的是,当他们注册请求时 - 他们提供的回调最终将在以后的某个时间调用,这是通常足够快,只要它们不通过在Node进程上执行大量同步CPU绑定工作来“阻止事件循环”。

您的具体问题

  

在哪个阶段是I / O事件(回调处理程序),比如'接收到新的HTTP请求','从先前的查询中从数据库接收的数据'?

它们在民意调查阶段执行:

  

如果轮询队列不为空,则事件循环将遍历其同步执行它们的回调队列,直到队列耗尽或达到系统相关的硬限制。

请注意,轮询阶段不是唯一可以执行I / O回调的地方。 (有点名不清楚)I/O callbacks阶段也负责一些回调。这是由于libuv的工作原理,并且在代码中应该是透明的。此外 - 一些库(如DB库)可以自己进行调度并在定时器内运行回调代码(在定时器阶段) - 并且一些异步回调(如关闭回调)在它们自己的阶段运行。

答案 1 :(得分:-1)

没有什么可以混淆的。所有异步回调都在回调阶段执行。它是解释器执行javascript的唯一两个地方之一:脚本启动时和回调阶段。