Nodejs事件引擎libuv源码剖析之:请求(request)结构的设计剖析

摘要:
在libuv中,请求表示用户向libuv发出的指令,例如uv_connect_S表示tcp连接请求_work_S表示任务请求,而要提交到libuv线程池执行的uv _ write_S表示写请求。下图显示了libuv中请求之间的关系。水平线上方的是抽象基类,水平线下方的是uv_ req_ t的直接子类。

     声明:本文为原创博文,转载请注明出处。   

     在libuv中,请求(request)代表一个用户向libuv发出的指令,比如uv_connect_s就表示一个tcp的连接请求、uv_work_s代表要递交给libuv线程池执行的任务请求、uv_write_s代表一个写请求。

     类似于上一篇讲句柄(handle)那样,请求也由一个抽象基类和相应的子类组成,这个基类就是uv_req_s,下面来看一下它的定义:

 1 /* Abstract base class of all requests. */
 2 struct uv_req_s {
 3   /* public */                                                                
 4   void* data;                                                                 
 5   /* read-only */                                                             
 6   uv_req_type type;                                                           
 7   /* private */                                                               
 8   void* active_queue[2];                                                      
 9   void* reserved[4];                                                          
10 };

     其中,data可以用来携带任何类型的用户数据;type为该请求的类型,其取值可以为:

 1 typedef enum {
 2             UV_UNKNOWN_REQ = 0,
 3             UV_REQ,
 4             UV_CONNECT,
 5             UV_WRITE,
 6             UV_SHUTDOWN,
 7             UV_UDP_SEND,
 8             UV_FS,
 9             UV_WORK,
10             UV_GETADDRINFO,
11             UV_GETNAMEINFO,
12             UV_REQ_TYPE_PRIVATE,
13             UV_REQ_TYPE_MAX,
14  } uv_req_type;

     active_queue是一个队列节点,该请求会通过该节点将自己挂载到所绑定的loop中的active_reqs队列上;该操作(添加、删除)主要通过uv__req_register和uv__req_unregister两个宏定义实现:

 1 #define uv__req_register(loop, req)                                           
 2   do {                                                                        
 3     QUEUE_INSERT_TAIL(&(loop)->active_reqs, &(req)->active_queue);            
 4   }                                                                           
 5   while (0)
 6 
 7 #define uv__req_unregister(loop, req)                                         
 8   do {                                                                        
 9     assert(uv__has_active_reqs(loop));                                        
10     QUEUE_REMOVE(&(req)->active_queue);                                       
11   }                                                                           
12   while (0)

     用户并不会直接使用以上两个宏,而是会使用uv__req_init来初始化一个请求,该函数实现如下:

 void uv__req_init(uv_loop_t* loop,
                         uv_req_t* req,
                         uv_req_type type) {
  uv_req_init(loop, req);
  req->type = type;
  uv__req_register(loop, req);//注册这个req
}

    请求并不会单独被处理,一个请求除了会被挂载在loop->active_reqs上,每个req都会被赋值给相应的句柄中的成员。下面画图libuv中各个请求中的关系,其中横线以上的为抽象基类,横线以下都是uv_req_t的直接子类。 

Nodejs事件引擎libuv源码剖析之:请求(request)结构的设计剖析第1张

免责声明:文章转载自《Nodejs事件引擎libuv源码剖析之:请求(request)结构的设计剖析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇FormData 知识点python接口自动化测试下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【Unity】伪线框渲染Shader的实现

线框Shader的渲染在游戏应用上还是有一定的需求,这次分享一个伪的线框渲染Shader。之所以称之为伪线框,是因为真正的线框应该渲染的是线,这在常规上是使用几何体着色器输出线段图元来实现。但是几何体着色器是DirectX 10的特性,所以针对移动平台,如果有少量线框渲染需求的,这个实现方法的门槛更低。 先说一下实现的原理:通过模型UV的边界来实现线框的渲...

Nodejs事件引擎libuv源码剖析之:高效线程池(threadpool)的实现

     声明:本文为原创博文,转载请注明出处。      Nodejs编程是全异步的,这就意味着我们不必每次都阻塞等待该次操作的结果,而事件完成(就绪)时会主动回调通知我们。在网络编程中,一般都是基于Reactor线程模型的变种,无论其怎么演化,其核心组件都包含了Reactor实例(提供事件注册、注销、通知功能)、多路复用器(由操作系统提供,比如kque...

libuv::进程

对于基于事件(event-based)的程序来说, 有个限制,没办法很好地利用多核,提高CPU使用率. 即使能够使用多线程编程来分发 handle, 但是每个 loop 还是只有一个线程. 这时候, 使用多进程就能够分担 loop 的压力,并且通过多进程 + 通信的方法, 会比 多线程 + 共享内存的方法更加安全, 易于开发. #include <c...

在Unity中实现画图/字帖功能

转载:https://blog.csdn.net/Patrick_Boom/article/details/107180717 前段时间总是加班,也没啥心情和精力去研究新东西,总结一下自己之前做的字帖的功能 先上效果图: 文章分为几部分: (一) 画图板实现原理 (二) 画图具体实现过程中的核心点 (三) 在画图板的基础上 演变为字帖的思路 · 画...

统计 PV、uv、独立ip

一、对pv、uv、独立访问ip的了解。   1、UV(Unique Visitor):独立访客,将每个独立上网电脑(cookie)视为一个独立访客,一天24小时之内,访问自己网站的访客数量。(相同cookie一天只被统计一次)   2、PV(Page View):访问量,即页面浏览量或者点击量,用户每次对网站的访问均被记录1次。用户对同一页面的多次访问,统...

Unity3D ShaderLab 模拟精灵动画

Unity3D ShaderLab 模拟精灵动画 在上一篇,介绍了通过Shader 模拟纹理运动,那么更深一步讲,我们也可以把帧动画的精灵纹理运动通过shader实现。 虽然大家都是在游戏脚本中做更高一级的控制。但是有钱就是任性,码代码的也可以码任性啊,我们就来试试做精灵的运动动画,遍历播放每一帧。   首先呢,准备一个精灵的动画序列帧,没有的找度娘要。然后...