温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何分析libuv中的idle、check、prepare阶段

发布时间:2021-12-09 09:26:10 阅读:250 作者:柒染 栏目:大数据
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

这期内容当中小编将会给大家带来有关如何分析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挂载到loopstart的时候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阶段了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

原文链接:https://my.oschina.net/u/4217331/blog/4379227

AI

开发者交流群×