Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Event Loop #19

Open
yubaoquan opened this issue Nov 26, 2018 · 0 comments
Open

Event Loop #19

yubaoquan opened this issue Nov 26, 2018 · 0 comments

Comments

@yubaoquan
Copy link
Owner

yubaoquan commented Nov 26, 2018

microtask

  • promise.then
  • process.nextTick
  • MutationObserver

macrotask

  • setTimeout
  • setInterval
  • setImmediate
  • UI渲染
  • I/O

nodejs 的 eventloop 分6个阶段

  1. timers: 执行 setInterval, setTimeout 到期的回调 (用最小堆而不是队列保存task)
  2. I/O callbacks: 上一轮时间循环残留的I/O 回调
  3. idle, prepare: 内部使用
  4. poll: I/O 操作
  5. check: setImmediate
  6. close callbacks: 各种close事件的回调
  • 每个阶段结束后, 都会检查是否有nextTick 并执行;
  • process.nextTick 内执行 process.nextTick 仍然将 tick 函数注册到当前 microtask 的尾部;
  • setImmediate 内执行 setImmediate 会将 immediate 函数注册到下一次 event loop 的 check 阶段;

浏览器中事件循环如何执行一个任务的流程

当执行栈(call stack)为空的时候,开始依次执行:

  1. 把最早的任务(task A)放入任务队列
  2. 如果 task A 为null (那任务队列就是空),直接跳到第6步
  3. 将 currently running task 设置为 task A
  4. 执行 task A (也就是执行回调函数)
  5. 将 currently running task 设置为 null 并移出 task A
  6. 执行 microtask 队列
    a: 在 microtask 中选出最早的任务 task X
    b: 如果 task X 为null (那 microtask 队列就是空),直接跳到 g
    c: 将 currently running task 设置为 task X
    d: 执行 task X
    e: 将 currently running task 设置为 null 并移出 task X
    f: 在 microtask 中选出最早的任务 , 跳到 b
    g: 结束 microtask 队列
  7. 跳到第一步
    上面就算是一个简单的 event-loop 执行模型

再简单点可以总结为:

  1. 在 macrotask 队列中执行最早的那个 task ,然后移出
  2. 执行 microtask 队列中所有可用的任务,然后移出
  3. 下一个循环,执行下一个 macrotask 中的任务 (再跳到第2步)

参考资料

不要混淆nodejs和浏览器中的event loop

理解事件循环一(浅析)

理解事件循环二(macrotask和microtask)

Event Loop 必知必会(六道题)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant