nodejs 定时器原理
2022-06-23 09:15:05 3 举报
从 JS 输入 setTimeout 到最终定时器被调用时的整个流程
作者其他创作
大纲/内容
ScheduleTimer(const FunctionCallbackInfo<Value>& args)
进入 timer 阶段
插入 timer_handle 到 libuv loop的 最小堆中
执行 timer 回调函数
从 libuv loop 的最小堆中获取到期的 timer_handle
内部调用
事件循环
processImmediate 函数
append 到链表中
从最小堆中取出最近的定时器 执行回调函数直到执行完所有可执行的定时器
JS 层面
RunTimers
processTimers 函数
执行 timer_handler 的回调函数
push 到最链表数组中
internalBinding
C++ & V8 层面
env->timers_callback_function() 获取回调函数
通过数组结构实现最小堆
Environment::RunTimers(uv_timer_t* handle)
JS 层面调用 setTimeout
node 启动时,调用 setupTimers
SetupTimers(const FunctionCallbackInfo<Value>& args)
new Timeout 对象
被设置为 env.timers_callback_function
其他阶段....
time_handle(): 获取 timer_handle 对象RunTimers: 定时器到期时的回调函数duration_ms: 超时时间
timerListQueue 链表数组
Environment::ScheduleTimer(int64_t duration_ms)
uv__run_timers
TimersList 链表
调用 libuv
scheduleTimer
作为参数
Libuv 层面
调用
env->set_timers_callback_function(args[1].As<Function>());
setTimeout
0 条评论
下一页