千家信息网

nodejs中怎么利用close实现事件循环

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,nodejs中怎么利用close实现事件循环,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。close是nodejs每轮事件循环中最后的一
千家信息网最后更新 2025年12月02日nodejs中怎么利用close实现事件循环

nodejs中怎么利用close实现事件循环,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

close是nodejs每轮事件循环中最后的一个阶段。我们看看怎么使用。我们知道对于一个handle,他的使用一般是init,start,stop。但是如果我们在stop一个handle之后,还有些事情需要处理怎么办?这时候就可以使用close阶段。close阶段可以用来关闭一个handle,并且执行一个回调。比如用于释放动态申请的内存。close阶段的任务由uv_close产生。

void uv_close(uv_handle_t* handle, uv_close_cb close_cb) {
// 正在关闭,但是还没执行回调等后置操作
handle->flags |= UV_HANDLE_CLOSING;
handle->close_cb = close_cb;

switch (handle->type) {

case UV_PREPARE:
uv__prepare_close((uv_prepare_t*)handle);
break;

case UV_CHECK:
uv__check_close((uv_check_t*)handle);
break;
...
default:
assert(0);
}

uv__make_close_pending(handle);
}

uv_close设置回调和状态,然后根据handle类型调对应的close函数,一般就是stop这个handle。比如prepare的close函数。

void uv__prepare_close(uv_prepare_t* handle) {                           
uv_prepare_stop(handle);
}

接着执行uv__make_close_pending往close队列追加节点。

// 头插法插入closing队列,在closing阶段被执行
void uv__make_close_pending(uv_handle_t* handle) {
handle->next_closing = handle->loop->closing_handles;
handle->loop->closing_handles = handle;
}

产生的节点在closing_handles队列中保存,然后在close节点逐个处理。

// 执行closing阶段的的回调
static void uv__run_closing_handles(uv_loop_t* loop) {
uv_handle_t* p;
uv_handle_t* q;

p = loop->closing_handles;
loop->closing_handles = NULL;

while (p) {
q = p->next_closing;
uv__finish_close(p);
p = q;
}
}

// 执行closing阶段的回调
static void uv__finish_close(uv_handle_t* handle) {
handle->flags |= UV_HANDLE_CLOSED;
...
uv__handle_unref(handle);
QUEUE_REMOVE(&handle->handle_queue);
if (handle->close_cb) {
handle->close_cb(handle);
}
}

逐个执行回调,close和stop有一点不同的是,stop一个handle,他不会从事件循环中被移除,但是close一个handle,他会从事件循环的handle队列中移除。
我们看一个使用了uv_close的例子(省略部分代码)。

int uv_fs_poll_start(uv_fs_poll_t* handle,
uv_fs_poll_cb cb,
const char* path,
unsigned int interval) {
struct poll_ctx* ctx;
// 分配一块堆内存存上下文结构体和path对应的字符串
ctx = uv__calloc(1, sizeof(*ctx) + len);
// 挂载上下文到handle
handle->poll_ctx = ctx;

}

uv_fs_poll_start是用于监听文件是否有改变的函数。他在handle里挂载了一个基于堆结构体。当结束监听的时候,他需要释放掉这块内存。

// 停止poll
int uv_fs_poll_stop(uv_fs_poll_t* handle) {
struct poll_ctx* ctx;
ctx = handle->poll_ctx;
handle->poll_ctx = NULL;
uv_close((uv_handle_t*)&ctx->timer_handle, timer_close_cb);
}

uv_fs_poll_stop通过uv_close函数关闭handle,传的回调是timer_close_cb。

// 释放上下文结构体的内存
static void timer_close_cb(uv_handle_t* handle) {
uv__free(container_of(handle, struct poll_ctx, timer_handle));
}

所以在close阶段就会是否这块内存。

看完上述内容,你们掌握nodejs中怎么利用close实现事件循环的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

阶段 事件 循环 内存 函数 队列 上下 上下文 结构 节点 内容 方法 更多 问题 处理 监听 不同 束手无策 为此 事情 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 美网络安全法 启示 石家庄超人电脑网络技术服务 我的世界萌新服务器账号 关于网络安全工程师的企业 数据库电话计费系统创建约束 软件开发模型先期精化 谈谈对银行网络安全的了解 思科网络技术学院网络课程 电脑爱数服务器人工服务电话 对数据库技术的看法 信息时代网络安全事迹 重庆长安汽车软件开发公司 沈阳软件开发王世德 厦门湖里区网络安全技术职高 近期网络安全法案例 设计一个学生课程的数据库 网络技术课调研统计报告分析 淘汰下来的服务器能做nas吗 TMS运输管理软件开发费用 plc属于工业网络技术吗 举动网络技术有限公司 30岁做软件开发买两套房 服务器导出文件乱码常用方案 交易系统软件开发制作 网络工程和网络技术的区别 计算机网络安全管理的内容 蛋白与蛋白之间关系数据库 怎么给虚拟机配置数据库 可能的更新数据库错误 特斯拉用户数据网络安全法
0