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

zmq源码分析之消息可读通知机制

文章目录核心流程详细实现1. 网络数据接收与解析2. 消息传递到 Socket3. 用户层通知机制4. zmq_poll 实现技术要点1. 消息完整性检测2. 通知机制3. 线程安全完整流程图示总结核心流程ZeroMQ 检测完整消息可读并通知用户的完整流程网络数据接收stream_engine从网络读取数据消息解析decoder解析数据检测完整消息消息传递通过pipe传递给session消息存储socket将消息存储在内部队列通知用户通过文件描述符的可读事件通知用户详细实现1. 网络数据接收与解析stream_engine 接收数据boolzmq::stream_engine_base_t::in_event_internal(){// 读取网络数据constintrcread(_inpos,bufsize);// 解码数据intrc_decoder-decode(_inpos,_insize);// 消息就绪时if(_decoder-message_ready()){msg_t*msg_decoder-msg();// 写入 pipe_pipe-write(msg);_pipe-flush();}}2. 消息传递到 Socketsession 处理voidzmq::session_base_t::read_activated(zmq::pipe_t*pipe_){// 从 pipe 读取消息msg_t msg;while(pull_msg(msg)0){// 处理消息// 写入 socket 的 pipe}}socket 接收voidzmq::socket_base_t::read_activated(zmq::pipe_t*pipe_){// 从 pipe 读取消息msg_t msg;while(pipe_-read(msg)){// 存储到内部队列_fq.push(msg);// 通知用户关键步骤if(_fq.size()1){// 第一次有消息时通知用户signaler-send();}}}3. 用户层通知机制文件描述符通知ZeroMQ 为每个 socket 创建一个通知文件描述符当有消息可读时通过signaler向该文件描述符写入数据用户可以通过ZMQ_FD获取该文件描述符使用poll/select等系统调用监听该文件描述符用户 API// 获取通知文件描述符zmq_fd_t fd;size_t fd_sizesizeof(fd);zmq_getsockopt(socket,ZMQ_FD,fd,fd_size);// 监听文件描述符structpollfdpfd;pfd.fdfd;pfd.eventsPOLLIN;poll(pfd,1,-1);// 检查是否有消息uint32_tevents;size_t events_sizesizeof(events);zmq_getsockopt(socket,ZMQ_EVENTS,events,events_size);if(eventsZMQ_POLLIN){// 有消息可读zmq_recv(socket,buffer,sizeof(buffer),0);}4. zmq_poll 实现socket_poller 检测intzmq::socket_poller_t::check_events(zmq::socket_poller_t::event_t*events_,intn_events_){intfound0;for(items_t::iterator it_items.begin(),end_items.end();it!endfoundn_events_;it){if(it-socket){// 检查 socket 事件uint32_tevents;it-socket-getsockopt(ZMQ_EVENTS,events,events_size);if(it-eventsevents){// 有事件发生events_[found].socketit-socket;events_[found].eventsit-eventsevents;found;}}}returnfound;}技术要点1. 消息完整性检测decoder负责解析网络数据检测消息边界message_ready当解析出完整消息时返回 true帧边界ZeroMQ 消息由多个帧组成decoder 负责检测帧边界2. 通知机制signaler跨平台的信号机制用于通知用户文件描述符每个 socket 对应一个通知文件描述符事件状态通过ZMQ_EVENTS获取 socket 的事件状态3. 线程安全线程安全 socket使用 signaler 机制非线程安全 socket直接使用文件描述符poller支持同时监听多个 socket完整流程图示┌─────────────────────────────────────────────────────────────────────┐ │ 消息可读通知流程 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ 1. 网络数据到达 │ │ └─ stream_engine::in_event() │ │ └─ 读取网络数据 │ │ └─ decoder::decode() 解析数据 │ │ └─ 检测消息完整性 │ │ └─ 完整消息就绪 │ │ │ │ 2. 消息传递 │ │ └─ _pipe-write(msg) 写入 pipe │ │ └─ session::read_activated() 处理 │ │ └─ socket::read_activated() 接收 │ │ └─ _fq.push(msg) 存储到队列 │ │ └─ signaler-send() 发送通知 │ │ │ │ 3. 用户检测 │ │ └─ poll() 检测文件描述符可读 │ │ └─ zmq_getsockopt(ZMQ_EVENTS) 检查事件 │ │ └─ zmq_recv() 读取消息 │ │ │ └─────────────────────────────────────────────────────────────────────┘总结ZeroMQ 检测完整消息可读并通知用户的机制消息解析decoder解析网络数据检测完整消息消息存储消息存储在 socket 的内部队列通知触发通过signaler触发文件描述符的可读事件用户检测用户通过poll或zmq_poll检测事件消息读取调用zmq_recv读取消息这种设计确保了用户能够及时得知有消息可读同时避免了忙等带来的性能损耗是 ZeroMQ 高效通信的重要基础。

相关文章:

zmq源码分析之消息可读通知机制

文章目录核心流程详细实现1. 网络数据接收与解析2. 消息传递到 Socket3. 用户层通知机制4. zmq_poll 实现技术要点1. 消息完整性检测2. 通知机制3. 线程安全完整流程图示总结核心流程 ZeroMQ 检测完整消息可读并通知用户的完整流程: 网络数据接收:stre…...

保姆级教程:在UE4.27里为你的UMG界面设置完美的DPI缩放规则(含Design Screen Size配置)

UE4 UMG界面DPI缩放全指南:从基础配置到多分辨率适配实战 在虚幻引擎4(UE4)项目中,UMG(Unreal Motion Graphics)界面系统是构建用户交互的核心工具。但许多开发者第一次将UI部署到不同设备时,都…...

Thunderbolt 5技术解析与首款设备评测

1. Thunderbolt 5技术概述与市场现状Thunderbolt 5作为英特尔最新推出的高速接口标准,去年首次亮相时就以120Gbps的惊人带宽和多重8K显示支持引发行业震动。经过一年多的等待,首批通过认证的设备终于进入消费市场。虽然目前可选产品屈指可数,…...

Display Driver Uninstaller终极指南:彻底清理显卡驱动的专业工具

Display Driver Uninstaller终极指南:彻底清理显卡驱动的专业工具 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-u…...

MySQL存储过程执行慢如何排查_优化存储过程性能的实战方法

存储过程性能问题通常源于内部SQL未走索引、循环单行DML、参数类型不匹配等;应查慢查询日志定位CALL语句,对关键SQL逐条EXPLAIN分析,避免隐式转换,优先用批量操作替代循环。查慢查询日志确认是不是存储过程本身慢很多情况下你以为…...

Cursor Pro破解工具深度解析:5步实现AI编程助手永久免费完整方案

Cursor Pro破解工具深度解析:5步实现AI编程助手永久免费完整方案 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reache…...

大数据分析专业京东电子数码产品销量评价数据集,数据量大约35000条

大数据分析专业京东电子数码产品销量评价数据集,数据量大约35000条,可以用于做数据分析毕设字段包含:订单编号 用户ID 下单时间 商品一级分类 商品名称 单价 销量(件) 订单总金额 支付方式 收货地区 订单状态 用户评分 用户评价数据详情参考&…...

【限时公开】某头部交易所MCP网关核心模块源码(含TLS1.3卸载、动态路由热加载、熔断指标埋点)

更多请点击: https://intelliparadigm.com 第一章:MCP网关架构设计与高性能通信模型概览 MCP(Microservice Communication Protocol)网关是面向云原生微服务生态构建的统一通信中枢,其核心目标是在异构协议、多语言服…...

如何3步完成百度文库文档纯净提取:突破付费限制的实用解决方案

如何3步完成百度文库文档纯净提取:突破付费限制的实用解决方案 【免费下载链接】baidu-wenku fetch the document for free 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wenku 在信息获取过程中,百度文库的付费门槛、广告干扰和内容加载限…...

微信聊天记录永久保存终极方案:无需越狱,完整导出文字、语音、图片

微信聊天记录永久保存终极方案:无需越狱,完整导出文字、语音、图片 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾经因为更换手机而丢失…...

仅限首批GCC 14.3+Clang 19.0开发者访问:C++26反射AST遍历器底层内存布局与constexpr反射缓存机制(附可运行benchmark)

更多请点击: https://intelliparadigm.com 第一章:C26反射特性在元编程中的应用源码分析 C26 正式引入静态反射(static reflection)核心设施,基于 std::reflexpr 和 meta::info 类型系统,使编译期类型 int…...

【国家级等保2.0三级强制要求】:C语言静态分析工具链选型白皮书(Coverity/CodeSonar/Clang Static Analyzer实测对比TOP5)

更多请点击: https://intelliparadigm.com 第一章:等保2.0三级合规性与C语言内存安全的强耦合逻辑 等保2.0三级要求明确将“内存安全缺陷”列为高风险项,尤其在关键业务系统中,未受控的指针操作、缓冲区越界及未初始化内存访问&a…...

【相机内参标定实战】—— 从棋盘格到配置文件:手把手完成张正友标定

1. 为什么需要相机标定? 第一次接触计算机视觉项目时,我拿着USB相机拍了几张照片就直接开始做目标检测,结果发现检测框总是对不齐物体。后来才知道,就像人眼戴了度数不合适的眼镜会看不清东西一样,未经标定的相机拍出来…...

Full Page Screen Capture:一键搞定完整网页截图的终极解决方案

Full Page Screen Capture:一键搞定完整网页截图的终极解决方案 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-chr…...

终极指南:4步构建专业级浏览器资源捕获与管理工作流

终极指南:4步构建专业级浏览器资源捕获与管理工作流 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓(cat-catch&#x…...

视频硬字幕提取终极指南:本地化OCR字幕识别完整解决方案

视频硬字幕提取终极指南:本地化OCR字幕识别完整解决方案 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包含字幕区域检测、字幕内…...

Pentaho Kettle 11.x架构深度解析:企业级数据集成性能优化实战

Pentaho Kettle 11.x架构深度解析:企业级数据集成性能优化实战 【免费下载链接】pentaho-kettle Pentaho Data Integration ( ETL ) a.k.a Kettle 项目地址: https://gitcode.com/gh_mirrors/pe/pentaho-kettle 在当今数据驱动的商业环境中,企业级…...

MTConnect C++ Agent部署与配置实战:工业数据采集核心组件详解

1. 项目概述:一个工业数据“翻译官”的自我修养 如果你在制造业、工业自动化或者工业物联网(IIoT)领域摸爬滚打过,肯定遇到过这样的场景:车间里那几台宝贝机床,一台是德国的,一台是日本的&…...

基于Chrome DevTools Protocol实现AI助手与真实浏览器会话的无缝交互

1. 项目概述:让AI助手“看见”你的真实浏览器世界 如果你正在尝试让AI助手(比如Claude、Cursor的AI Agent,或者你自己构建的智能体)帮你处理网页上的任务,大概率会遇到一个核心痛点: 隔离 。无论是Puppe…...

基于下垂控制的光储直流微电网模型:包含光伏、储能与直流负载

基于下垂控制的光储直流微电网模型1.模型由光伏和储能以及直流负载组成 2.光伏采用扰动观测法实现最大功率输出,储能刚开始采用恒定电压控制,电压稳定在额定电压附近,2s之后采用下垂控制,母线电压降低,达到目标光伏板在…...

马尔可夫链蒙特卡洛(MCMC)原理与应用指南

1. 概率世界的探索工具:马尔可夫链蒙特卡洛入门当我们需要在复杂概率分布中进行采样或计算期望值时,传统方法往往束手无策。想象你面前有一片形状奇特的山脉,需要计算平均海拔——常规的均匀采样会浪费大量时间在平坦区域,而重要区…...

10个常见排版问题解决方案:TypographyHandbook 终极指南

10个常见排版问题解决方案:TypographyHandbook 终极指南 【免费下载链接】TypographyHandbook A concise, referential guide on best web typographic practices. 项目地址: https://gitcode.com/gh_mirrors/ty/TypographyHandbook TypographyHandbook 是一…...

终极显卡驱动清理完整指南:Display Driver Uninstaller(DDU)深度解析与实战应用

终极显卡驱动清理完整指南:Display Driver Uninstaller(DDU)深度解析与实战应用 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.…...

PowerShell脚本编译终极指南:如何用Win-PS2EXE轻松打包脚本为EXE文件

PowerShell脚本编译终极指南:如何用Win-PS2EXE轻松打包脚本为EXE文件 【免费下载链接】PS2EXE Module to compile powershell scripts to executables 项目地址: https://gitcode.com/gh_mirrors/ps/PS2EXE 还在为PowerShell脚本分发而烦恼吗?每次…...

如何高效使用ComfyUI-Impact-Pack:专业图像增强与语义分割实战指南

如何高效使用ComfyUI-Impact-Pack:专业图像增强与语义分割实战指南 【免费下载链接】ComfyUI-Impact-Pack Custom nodes pack for ComfyUI This custom node helps to conveniently enhance images through Detector, Detailer, Upscaler, Pipe, and more. 项目地…...

如何在7分钟内搭建专业级仓库管理系统:从零到生产就绪的完整指南

如何在7分钟内搭建专业级仓库管理系统:从零到生产就绪的完整指南 【免费下载链接】GreaterWMS This Inventory management system is the currently Ford Asia Pacific after-sales logistics warehousing supply chain process . After I leave Ford , I start thi…...

Roda测试驱动开发:使用Rack::Test和Minitest构建可靠应用

Roda测试驱动开发:使用Rack::Test和Minitest构建可靠应用 【免费下载链接】roda Routing Tree Web Toolkit 项目地址: https://gitcode.com/gh_mirrors/ro/roda Roda是一个高效的Routing Tree Web Toolkit,采用测试驱动开发(TDD&#…...

向量值函数:从基础概念到工程实践

1. 向量值函数入门指南第一次接触向量值函数时,我被这个看似高深的概念吓到了。直到在实际物理仿真项目中不得不使用它,才发现这不过是把多个输出打包在一起的函数而已。就像同时控制机械臂的x、y、z三个坐标位置,本质上就是用一个函数输出三…...

Catlab.jl:Julia语言中的应用范畴论终极指南

Catlab.jl:Julia语言中的应用范畴论终极指南 【免费下载链接】Catlab.jl A framework for applied category theory in the Julia language 项目地址: https://gitcode.com/gh_mirrors/ca/Catlab.jl Catlab.jl是一个用Julia语言编写的应用和计算范畴论框架&a…...

Keras实现Mask R-CNN目标检测实战教程

1. 基于Keras的Mask R-CNN照片目标检测实战指南在计算机视觉领域,目标检测一直是核心挑战之一。不同于简单的图像分类,我们需要同时识别图像中的多个对象并精确标定它们的位置。传统方法如R-CNN系列已经逐步进化到更强大的Mask R-CNN架构,它不…...