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

ZLMediaKit 源码分析(二):EventPoller 事件循环机制深度分析

EventPoller 是 ZLMediaKit/ZLToolKit 网络层的核心引擎,本文从源码逐行分析其在 Linux 下的 epoll 实现,包括事件循环、异步任务、延时队列和退出机制。1. EventPoller 在架构中的位置┌─────────────────────────────────────────────┐ │ 业务层:RtspSession / RtmpSession / ... │ ├─────────────────────────────────────────────┤ │ 网络抽象层:Socket / TcpServer │ ├─────────────────────────────────────────────┤ ← 本篇重点 │ 事件引擎层:EventPoller / EventPollerPool │ ├─────────────────────────────────────────────┤ │ 系统调用层:epoll_create / epoll_ctl / ... │ └─────────────────────────────────────────────┘2. 类结构2.1 继承关系TaskExecutor (线程任务执行器) └─ EventPoller (事件轮询器) └─ EventPollerPool (线程池管理多个 EventPoller)TaskExecutor:继承ThreadPool,提供async()投递任务能力EventPoller:在其基础上增加 epoll 事件循环EventPollerPool:单例,管理多个 EventPoller 实例2.2 EventPoller 核心成员// ZLToolKit/src/Poller/EventPoller.cppclassEventPoller:publicTaskExecutor{public:usingPtr=std::shared_ptrEventPoller;private:int_epoll_fd=-1;// epoll 实例 fdint_pipe_fd[2]={-1,-1};// pipe 用于唤醒 epoll_waitstd::mutex _mtx;// 保护 _event_mapstd::unordered_mapint,PollEventCB_event_map;// fd → 事件回调std::dequePollTaskCB_list_task;// 异步任务队列DelayTaskMap _delay_task_map;// 延时任务(按执行时间排序)bool_exit_flag=false;// 退出标志};3. 构造与初始化EventPoller::EventPoller(ThreadPool::Priority priority){// 1. 创建 epoll 实例_epoll_fd=epoll_create1(EPOLL_CLOEXEC);if(_epoll_fd==-1){throwstd::runtime_error("epoll_create1 failed");}// 2. 创建 pipe 用于唤醒if(pipe(_pipe_fd)!=0){close(_epoll_fd);throwstd::runtime_error("pipe failed");}// 3. 将 pipe 读端注册到 epoll// 当有异步任务投递时,往 pipe 写端写 1 字节,唤醒 epoll_waitaddEvent(_pipe_fd[0],EPOLLIN,[this](intevent){onPipeEvent();});}网络库级调用链:epoll_create1(EPOLL_CLOEXEC)→ 创建 epoll 实例pipe()→ 创建管道作为通知机制epoll_ctl(_epoll_fd, EPOLL_CTL_ADD, _pipe_fd[0], ev)→ 注册管道读端4. runLoop — 事件循环核心voidEventPoller::runLoop(boolis_try){constintmax_events=1024;structepoll_eventevents
http://www.zskr.cn/news/1414742.html

相关文章:

  • 国产流量计哪家强?内行人揭秘这家隐形冠军企业,实力不容小觑! - 品牌推荐大师
  • 终极指南:如何快速在Vue 3项目中集成专业代码编辑器
  • 中小团队如何利用Taotoken统一管理多项目的AI模型调用与成本
  • AI 写代码不放心?给技术博客准备一份代码审校清单
  • Sora 2房地产视频展示全链路拆解:建模→光照→材质→动线→合规性,9大技术断点逐个击破
  • Qt自定义控件避坑指南:从仪表盘案例看QPainter绘图的5个性能陷阱与优化技巧
  • 终极指南:三步掌握ytDownloader,轻松下载全网视频资源
  • M9A智能自动化框架深度解析:从架构设计到实战部署指南
  • 厦门道路救援:汽车突发故障应急处理与避坑指南 - 百航
  • 030、TensorFlow Lite Micro架构与原理
  • 合肥刑事律师选择指南:李先民律师专业能力与服务品质并重 - 资讯焦点
  • 解密PoinTr:基于Transformer的3D点云补全技术深度解析与实战指南
  • 学校数字广播系统选型全攻略:2026年如何避坑选到最优解 - 品牌优选官
  • 深度剖析Telephone:如何用Swift+SIP构建Mac端专业级VoIP客户端
  • 乌鸡蛋直供甄选指南:认准原种货源少走弯路 - 讲清楚了
  • 别再装错了!Burp Suite 超详细安装教学,图文步骤手把手教你
  • 快速原型开发中如何借助 Taotoken 分钟级接入多个主流模型
  • 跨境独立站多端适配开发:多语言+多货币+跨平台同步技术实战
  • 【2026】同等学历-计算机-数学
  • 高效智能视觉系统:基于YOLOv8的多线程目标检测与实时追踪实战指南
  • SysML v2系统建模实战宝典:从零构建复杂系统的终极指南
  • BuildingAI 开源智能体平台体验:从一键部署到商业闭环的真实感受
  • 在自动化Agent工作流中集成Taotoken提供稳定的大模型能力
  • 哔哩下载姬完整教程:3分钟掌握B站视频高效下载技巧
  • AI 商学院与算力共享:星瀚云如何让 AI“用得深“、让算力“活起来“
  • 2026年凯里国防班哪家好?低分进高分出与定向士官升学成新标准 - 年度推荐企业名录
  • 从零搭建纯硬件寻线机器人:模拟电路实现自主导航
  • Arduino与舵机制作交互式乐高迷你高尔夫:从电路到代码的完整实践
  • 井下做业实景透明.智能预警透明化三维立体重构视频伴生数字伴生解决方案
  • GBase 8a之自动清理日志实现方式