当前位置: 首页 > news >正文

ngx_event_add_timer

1 定义

ngx_event_add_timer 函数 定义在 ./nginx-1.24.0/src/event/ngx_event_timer.h
staticngx_inlinevoidngx_event_add_timer(ngx_event_t*ev,ngx_msec_ttimer){ngx_msec_tkey;ngx_msec_int_tdiff;key=ngx_current_msec+timer;if(ev->timer_set){/* * Use a previous timer value if difference between it and a new * value is less than NGX_TIMER_LAZY_DELAY milliseconds: this allows * to minimize the rbtree operations for fast connections. */diff=(ngx_msec_int_t)(key-ev->timer.key);if(ngx_abs(diff)<NGX_TIMER_LAZY_DELAY){ngx_log_debug3(NGX_LOG_DEBUG_EVENT,ev->log,0,"event timer: %d, old: %M, new: %M",ngx_event_ident(ev->data),ev->timer.key,key);return;}ngx_del_timer(ev);}ev->timer.key=key;ngx_log_debug3(NGX_LOG_DEBUG_EVENT,ev->log,0,"event timer add: %d: %M:%M",ngx_event_ident(ev->data),timer,ev->timer.key);ngx_rbtree_insert(&ngx_event_timer_rbtree,&ev->timer);ev->timer_set=1;}
ngx_event_add_timer 函数用于 为事件添加或更新超时定时器,并将定时器节点插入全局红黑树中。 为了优化高并发下快速连接的重复更新,它采用惰性策略: 若事件已有定时器且新旧到期时间差小于 `NGX_TIMER_LAZY_DELAY`, 则直接复用旧定时器,避免不必要的红黑树删除与插入操作,从而降低 CPU 开销。

2 详解

1 函数签名

staticngx_inlinevoidngx_event_add_timer(ngx_event_t*ev,ngx_msec_ttimer)
无返回值
参数 1 ngx_event_t *ev 当前需要添加定时器的事件 参数 2 ngx_msec_t timer 超时时间,单位是毫秒 从“现在”开始计时。

2 逻辑流程

1 局部变量 2 计算到期时间 3 已有定时器 4 插入定时器

1 局部变量
{ngx_msec_tkey;ngx_msec_int_tdiff;

2 计算到期时间
key=ngx_current_msec+timer;
计算事件应该超时的绝对时间。 ngx_current_msec 是全局变量, 在每次事件循环迭代开始时被更新为当前系统毫秒时间。 将相对超时 timer 加上当前时间, 得到到期时刻 key。 这样定时器只需与一组全局递增的时间戳比较, 而无需倒计时,极大简化了超时检测逻辑。

3 已有定时器
if(ev->timer_set){/* * Use a previous timer value if difference between it and a new * value is less than NGX_TIMER_LAZY_DELAY milliseconds: this allows * to minimize the rbtree operations for fast connections. */diff=(ngx_msec_int_t)(key-ev->timer.key);if(ngx_abs(diff)<NGX_TIMER_LAZY_DELAY){ngx_log_debug3(NGX_LOG_DEBUG_EVENT,ev->log,0,"event timer: %d, old: %M, new: %M",ngx_event_ident(ev->data),ev->timer.key,key);return;}ngx_del_timer(ev);}
检查该事件当前是否已有定时器存在于红黑树中。 ev->timer_set 是一个布尔标志, 为真表示定时器节点已在全局定时器红黑树内。 若已存在,则进入更新路径,需要决定是否修改; 否则直接跳到插入逻辑。这构成了惰性更新的前置判断。
计算新到期时间 key 与旧到期时间 ev->timer.key 的有符号差值。 减法产生无符号结果,再显式转换为有符号型 ngx_msec_int_t。 这一步将环绕差值转化为数学上的真实差值(例如 1 - 10 = -9 而不是极大的正数), 确保后续比较的准确性。 判断新旧到期时间的绝对差是否在惰性延迟阈值内。 ngx_abs(diff) 取绝对值,忽略方向,只关心变化幅度。 NGX_TIMER_LAZY_DELAY 是一个编译期常量(通常 1~2 毫秒)。 若差值小于该值,则认为定时器“足够接近”,无需真正更新。
从全局红黑树中删除该事件现有的定时器节点。 当新旧差值超出允许的惰性范围,意味着必须更新超时时间。 需要先将旧节点从树中移除,再插入新节点。 ngx_del_timer 内部会调用 ngx_rbtree_delete, 并可能将 timer_set 置零(具体依赖实现),为重新插入做准备。

4 插入定时器
ev->timer.key=key;ngx_log_debug3(NGX_LOG_DEBUG_EVENT,ev->log,0,"event timer add: %d: %M:%M",ngx_event_ident(ev->data),timer,ev->timer.key);ngx_rbtree_insert(&ngx_event_timer_rbtree,&ev->timer);ev->timer_set=1;}
将新计算的绝对到期时间赋值给事件内部的定时器节点。 将事件的定时器节点插入到全局定时器红黑树中。 将事件的定时器标记为“已设置”。
http://www.jsqmd.com/news/781193/

相关文章:

  • Claude技能库开发指南:从工具调用原理到AI Agent实战
  • Triplex:专为React Three.js设计的类型安全状态管理方案
  • 高维离散视觉生成:Cubic Discrete Diffusion技术解析
  • HY-Motion 1.0快速部署指南:一键启动,让3D动作生成像打开网页一样简单
  • DeepSearch:基于MCTS的数学推理优化框架解析
  • 本地无状态AI助手:基于RAG与向量搜索的隐私优先设计
  • AI内容人性化:从机器输出到人类表达的behuman项目实践
  • 19英寸电子设备机柜设计核心要素与工程实践
  • DMVAE:通过分布匹配提升变分自编码器性能
  • Phi-4-mini-reasoning开源大模型教程:FP16量化与显存占用优化技巧
  • OpenAutoNLU:开源AutoML助力NLP任务自动化
  • 基于LangGraph的AI智能体开发:从模板到实战应用
  • 为什么越懂事的人,越容易不快乐?
  • FireRedASR-AED-L惊艳效果展示:粤语/四川话/中英混杂语音高准确率识别集
  • DrivePI:基于MLLM的自动驾驶4D感知与控制
  • HFSS仿真进阶:当微带天线遇上FR4损耗(从失配到调谐的实战记录)
  • 基于大语言模型与本地NLP的AI作文生成器:技术架构与工程实践
  • RecallForge:基于语义检索的本地化智能代码复用引擎设计与实践
  • 苹果探索与英特尔合作制造芯片,英特尔股价单日暴涨13%
  • 基于Langchain-Chatchat构建企业级知识库问答系统:从原理到部署实战
  • 量化研究开源工具箱:从数据到回测的工程实践指南
  • Java进程突然挂了如何排查?
  • 轻量级VLA框架在自动驾驶中的空间理解与感知应用
  • MongoDB防注入攻击指南
  • Dify与Langfuse集成:实现大模型应用可观测性的完整指南
  • TSMaster虚拟LIN通道实战:5分钟搞定C脚本自动发送报文(附完整代码)
  • 终极歌词同步神器:如何一键为你的离线音乐库批量下载LRC歌词
  • 探索AI安全与系统思维:开源项目“文明操作系统”深度解析
  • 横向柱状图的艺术:使用Vue Chart.js
  • CodeSurface:AI原生开发环境如何重塑编程工作流