如何分析libuv中的idle、check、prepare阶段
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,这期内容当中小编将会给大家带来有关如何分析libuv中的idle、check、prepare阶段,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。idle、check、
千家信息网最后更新 2025年12月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安全错误
数据库的锁怎样保障安全
知网数据库中的网页资源更新速度
数据库的设计第几范式
系统数据库sql
泸州敏思网络技术
数据库技术与应用教学用书
怎么查看虚拟复用器的备用服务器
samba服务器配置文件
网络技术应用 浙教版pdf
软件开发工具能帮助开发人员
肇庆通讯软件开发厂家直销
趣味软件开发是什么东西
2019年世界网络技术峰会
长沙市服务器搬运
云平台需要数据库吗
圣岛服务器第26期
华为网络技术天才
硬件vpn服务器
松勤软件开发
网络技术的优点和 缺点
补丁服务器指向官网
现代通信网络技术期末试卷
数据库镜像同步
服务器突然不能动了
派派聊天软件开发
跑跑卡丁车辅助软件开发
福州网络安全备案
csol单机自己搭建服务器
代码托管服务器
网络安全专题党课
adas嵌入式软件开发