如何分析libuv中的idle、check、prepare阶段
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这期内容当中小编将会给大家带来有关如何分析libuv中的idle、check、prepare阶段,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。idle、check、
千家信息网最后更新 2026年11月03日如何分析libuv中的idle、check、prepare阶段
这期内容当中小编将会给大家带来有关如何分析libuv中的idle、check、prepare阶段,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
idle、check、prepare是libuv事件循环中的三个阶段,这三个阶段主要是从各自的队列里拿出任务执行,有各自对应的数据结构。nodejs的setImmediate会使用这些阶段。
#include "uv.h"
#include "internal.h"
#define UV_LOOP_WATCHER_DEFINE(name, type)
int uv_##name##_init(uv_loop_t* loop, uv_##name##_t* handle) {
// 初始化handle的类型,所属loop,打上UV_HANDLE_REF,并且把handle插入loop->handle_queue队列的队尾
uv__handle_init(loop, (uv_handle_t*)handle, UV_##type);
handle->name##_cb = NULL;
return 0;
}
int uv_##name##_start(uv_##name##_t* handle, uv_##name##_cb cb) {
// 如果已经执行过start函数则直接返回
if (uv__is_active(handle)) return 0;
if (cb == NULL) return UV_EINVAL;
// 把handle插入loop中相应类型的队列,loop有prepare,idle和check三个队列
QUEUE_INSERT_HEAD(&handle->loop->name##_handles, &handle->queue);
// 挂载回调,下一轮循环的时候被执行
handle->name##_cb = cb;
// 设置UV_HANDLE_ACTIVE标记位,并且loop中的handle数加一,init的时候只是把handle挂载到loop,start的时候handle才处于激活态
uv__handle_start(handle);
return 0;
}
int uv_##name##_stop(uv_##name##_t* handle) {
if (!uv__is_active(handle)) return 0;
// 把handle从loop中相应的队列移除,但是还挂载到handle_queue中
QUEUE_REMOVE(&handle->queue);
// 清除active标记位并且减去loop中handle的active数
uv__handle_stop(handle);
return 0;
}
// 在每一轮循环中执行该函数,执行时机见uv_run
void uv__run_##name(uv_loop_t* loop) {
uv_##name##_t* h;
QUEUE queue;
QUEUE* q;
// 把该类型对应的队列中所有节点摘下来挂载到queue变量
QUEUE_MOVE(&loop->name##_handles, &queue);
// 遍历队列,执行每个节点里面的函数
while (!QUEUE_EMPTY(&queue)) {
// 取下当前待处理的节点
q = QUEUE_HEAD(&queue);
// 取得该节点对应的整个结构体的基地址
h = QUEUE_DATA(q, uv_##name##_t, queue);
// 把该节点移出当前队列
QUEUE_REMOVE(q);
// 重新插入原来的队列
QUEUE_INSERT_TAIL(&loop->name##_handles, q);
// 执行回调函数
h->name##_cb(h);
}
}
void uv__##name##_close(uv_##name##_t* handle) {
uv_##name##_stop(handle);
}
UV_LOOP_WATCHER_DEFINE(prepare, PREPARE)
UV_LOOP_WATCHER_DEFINE(check, CHECK)
UV_LOOP_WATCHER_DEFINE(idle, IDLE)利用宏定义,在预处理阶段拓展成三个不同类型,但是处理逻辑一样的代码。有三种类型,分别是prepare,check,idle。
上述就是小编为大家分享的如何分析libuv中的idle、check、prepare阶段了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。
队列
阶段
类型
节点
分析
三个
函数
时候
循环
内容
标记
结构
一轮
处理
不同
专业
中小
事件
代码
任务
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网金融科技
科技互联网政务服务
互联网巨头反垄断金融科技
平安科技 互联网
北京互联网络科技有限公司
远拓互联网科技
善班互联网科技有限公司
互联网高科技企业
互联网 新科技
一五八零互联网科技
互联网公司会议桌创意科技软装饰
常德市电业局互联网科技部
青海科技产业互联网发展
国大互联网教育科技有限公司工作
深圳艾果互联网通讯科技
特约风豹互联网科技为什么扣费
广州三三互联网科技有限公司
好易买互联网科技
华人运通互联网科技公司
如何强化互联网金融科技
互联网科技有限公司经营范围
苏州互联网科技贷款公司
青海省互联网新科技
互联网教育科技公司vipkid
北京华百购互联网科技有限公司
华服互联网科技官网
互联网硬科技公司
抖集互联网科技技术咨询
互联网科技自媒体灵感
小牛互联网科技有限公司地址