当前位置: 首页 > 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_ptr<EventPoller>;private:int_epoll_fd=-1;// epoll 实例 fdint_pipe_fd[2]={-1,-1};// pipe 用于唤醒 epoll_waitstd::mutex _mtx;// 保护 _event_mapstd::unordered_map<int,PollEventCB>_event_map;// fd → 事件回调std::deque<PollTaskCB>_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.cnnetsun.cn/news/2619428.html

相关文章:

  • AI教材写作指南:低查重工具助力,3天完成20万字教材编写!
  • 针对gdb出现DWARF错误的问题
  • BetterGenshinImpact:解放双手的原神智能助手,让游戏体验更轻松高效
  • MSYS2 Builds Hashes Cygwin Builds Hashes 区别
  • AOP+自定义注解实现角色验证
  • ESP8266与Blynk物联网入门:从零构建手机遥控LED系统
  • AI 日报 | 2026年5月28日
  • Dism++终极指南:如何用免费工具彻底优化Windows系统性能
  • 【限时解禁】Sora 2提示词工程终极矩阵:含12维可控性参数表、8类高危歧义词库与实时反馈校准协议(OpenAI内部培训材料精编版)
  • 从零到一:如何用新蜂商城快速构建你的电商帝国
  • 医院导航定位系统技术方案与落地实战
  • RPG Maker解密实战:3步提取加密游戏资源的完整指南
  • 《机乎 vs Moltbook:2026 年 AI 社交平台深度对比》
  • Lean量化交易引擎:从零到一的完整实战指南
  • 架构革新:重新定义OpenCore配置管理的新范式
  • Spark算子 - Python
  • 完全免费!不用花一分钱调用 GPT4!公司代码不会泄露!断网也能用!
  • uVision调试器C++开发限制与解决方案
  • 基于SQLite的本地化二次智能决策系统设计与实现
  • 3分钟解锁网易云音乐NCM格式:Windows用户必备的免费图形化解密工具终极指南
  • U盘版小龙虾教程
  • 【他山之石】盖瑞·查普曼《爱的五种语言》导读
  • 手把手教你用Claude Code打造自己的视频创作智能体(1)
  • 从数据看板到决策智能体:基于因果推断与约束优化的自动化策略生成实战
  • 记录AI学习之路Day01 Vibe Coding
  • 上海办公室装修省钱技巧
  • 自条件化与非自回归吸引子:提升端到端说话人日志模型性能
  • Switch游戏画面电脑同步终极指南:5分钟实现高清直播录制
  • 从提示词工程到上下文工程:构建AI就绪的项目心智模型
  • 角色驱动AI编程工作流:从概念到实践,构建你的虚拟开发团队