Open MJingv opened 4 years ago
libuv 库怎么安排异步任务在主线程上执行
// test.js setTimeout(() => console.log(1)); setImmediate(() => console.log(2)); process.nextTick(() => console.log(3)); Promise.resolve().then(() => console.log(4)); (() => console.log(5))();
(() => console.log(5))();
异步任务可以分成两种
异步任务
本轮循环
次轮循环
// 下面两行,次轮循环执行 setTimeout(() => console.log(1)); setImmediate(() => console.log(2)); // 下面两行,本轮循环执行 process.nextTick(() => console.log(3)); Promise.resolve().then(() => console.log(4));
最快执行
process.nextTick(() => console.log(3));
"微任务"(microtask)
process.nextTick(() => console.log(3)); Promise.resolve().then(() => console.log(4)); // 3 // 4
简单的顺序
1.同步任务 2.process.nextTick() 3.微任务
"When Node.js starts, it initializes the event loop, processes the provided input script which may make async API calls, schedule timers, or call process.nextTick(), then begins processing the event loop."
Node 开始执行脚本时,会先进行事件循环的初始化,但是这时事件循环还没有开始,会先完成下面的事情。
同步任务 发出异步请求 规划定时器生效的时间 执行process.nextTick()等等
每一轮的事件循环,分成六个阶段。这些阶段会依次执行。
timers 时间循环 这个是定时器阶段,处理setTimeout()和setInterval()的回调函数 I/O callbacks idle, prepare libuv 内部调用 poll 轮询时间 check 该阶段执行setImmediate()的回调函数 close callbacks 该阶段执行关闭请求的回调函数,比如socket.on('close', ...)
Node 定时器详解
node-event-loop
libuv 库怎么安排异步任务在主线程上执行
一、同步任务和异步任务
二、本轮循环和次轮循环
异步任务
可以分成两种本轮循环
的异步任务 先执行次轮循环
的异步任务 后执行三、process.nextTick()
最快执行
的四、微任务
"微任务"(microtask)
队列。简单的顺序
五、事件循环的概念
Node 开始执行脚本时,会先进行事件循环的初始化,但是这时事件循环还没有开始,会先完成下面的事情。
同步任务 发出异步请求 规划定时器生效的时间 执行process.nextTick()等等
六、事件循环的六个阶段
每一轮的事件循环,分成六个阶段。这些阶段会依次执行。
timers 时间循环 这个是定时器阶段,处理setTimeout()和setInterval()的回调函数 I/O callbacks idle, prepare libuv 内部调用 poll 轮询时间 check 该阶段执行setImmediate()的回调函数 close callbacks 该阶段执行关闭请求的回调函数,比如socket.on('close', ...)
Node 定时器详解