猿问

一个 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

结合文章中给出的示意图

我理解的执行顺序是:

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

但是在随后文中的描述

https://img.mukewang.com/5ca5a75300019ea808000655.jpg

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


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

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


的理解是否存在问题?)


MM们
浏览 463回答 1
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)) {
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答