一个 nodejs event loop 中不同 阶段的顺序问题。

The Node.js Event Loop, Timers, and process.nextTick() 文章中介绍了 event loop

的概念和其分别的几个阶段(phase)

  1. close callbacks
  2. check
  3. poll
  4. idle,prepare
  5. pending callbacks
  6. timers

结合文章中给出的示意图

clipboard.png

我理解的执行顺序是:

 1 -> 2 -> 3 -> 4 -> 5 -> 6
 

但是在随后文中的描述

clipboard.png

似乎表达的相反的执行顺序:

6 -> 5 -> 4 -> 3 -> 2-> 1

但是因为在同一个 i/o cycle 中

// timeout_vs_immediate.js
const fs = require('fs');

fs.readFile(__filename, () => {
  setTimeout(() => {
    console.log('timeout');
  }, 0);
  setImmediate(() => {
    console.log('immediate');
  });
});
// immediate 总是在 timeout 前面完成
$ node timeout_vs_immediate.js
immediate
timeout

$ node timeout_vs_immediate.js
immediate
timeout

那么到底这些阶段有没有优先级顺序?如果有?何种为正确的?文档中描述和图示是否有冲突?(就是我对于英语

的理解是否存在问题?)

阅读 2k
1 个回答

一知半解也不好回答你,毕竟没读过源码,这篇文章应该是你需要的内容。
nodejs中的event loop

以下为文章poll源码中与问题相关部分的两行代码

    while (!QUEUE_EMPTY(&loop->watcher_queue)) {

    //阻塞直到监听的事件来临,前面已经算好timeout以防uv_loop一直阻塞下去
    if (no_epoll_wait != 0 || (sigmask != 0 && no_epoll_pwait == 0)) {
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题