【socket] 发布与订阅 📅 发布时间:2026/7/4 2:26:05 👁️ 浏览次数: 上面代码应该怎么执行呢zmq.XPUB是 ZeroMQ 中用于发布-订阅模式的一种套接字类型它是标准PUB套接字的扩展。与PUB只能单向发送数据不同XPUB可以接收来自订阅者的订阅和取消订阅消息从而让发布者了解当前有哪些主题被订阅。这使得我们可以构建更智能的发布者或实现消息代理broker。主要用途构建代理Proxy与XSUB套接字配合形成代理节点实现消息转发和过滤。动态感知订阅发布者可以知道哪些主题正在被订阅从而按需发送数据例如只发送有订阅者的主题。监控与统计可以统计订阅者数量、主题热度等。基本用法XPUB套接字的使用与PUB类似但增加了一个接收订阅事件的能力。订阅事件以消息的形式到达消息的第一个字节表示操作类型1订阅subscription0取消订阅unsubscription后续字节为主题内容。关键选项ZMQ_XPUB_VERBOSE默认情况下XPUB只会报告新的订阅第一次订阅某个主题而不会报告重复订阅。设置此选项后每次收到订阅消息都会报告包括重复订阅。ZMQ_XPUB_MANUAL启用手动确认模式发布者需要自己维护订阅关系适用于高级场景。代码示例Python下面是一个简单的 Python 示例展示XPUB如何接收订阅事件并发送数据。importzmqimporttime# 创建上下文contextzmq.Context()# 创建 XPUB 套接字发布端xpubcontext.socket(zmq.XPUB)xpub.bind(tcp://*:5555)# 设置选项接收所有订阅事件包括重复订阅xpub.setsockopt(zmq.XPUB_VERBOSE,True)# 创建一个轮询器同时监控 XPUB 的可读事件订阅事件和标准输入可选pollerzmq.Poller()poller.register(xpub,zmq.POLLIN)print(XPUB 发布者已启动等待订阅事件...)# 主循环whileTrue:socksdict(poller.poll(100))# 100ms 超时ifxpubinsocksandsocks[xpub]zmq.POLLIN:# 收到订阅事件eventxpub.recv()# 第一个字节b\x01 表示订阅b\x00 表示取消订阅ifevent[0]1:topicevent[1:].decode(utf-8)print(f新订阅主题:{topic})elifevent[0]0:topicevent[1:].decode(utf-8)print(f取消订阅主题:{topic})# 定期发送消息例如每秒一次# 在实际应用中可以根据订阅情况决定发送哪些主题time.sleep(1)xpub.send_multipart([bnews,bHello, subscribers!])对应的订阅端SUB订阅端可以使用普通的SUB套接字连接到XPUB并发送订阅请求importzmq contextzmq.Context()subcontext.socket(zmq.SUB)sub.connect(tcp://localhost:5555)sub.setsockopt_string(zmq.SUBSCRIBE,news)# 订阅 news 主题whileTrue:topic,msgsub.recv_multipart()print(f收到 [{topic.decode()}]:{msg.decode()})当订阅端启动时XPUB会收到一个订阅事件第一个字节为b\x01主题为news。如果订阅端关闭或修改订阅也会收到相应事件。常见问题XPUB 能否直接与 SUB 通信可以。SUB套接字发送的订阅消息会被XPUB接收而PUB则不会接收任何消息。如何知道当前所有订阅XPUB本身不维护订阅列表需要用户自己根据收到的事件动态记录。可以使用ZMQ_XPUB_MANUAL选项手动管理。性能影响接收订阅事件会增加一些开销但对于大多数应用来说可以忽略。如果订阅者数量巨大可以考虑使用代理模式。总结zmq.XPUB是一个功能强大的套接字类型它让发布者“看见”订阅者从而可以实现更灵活的消息分发逻辑。通过结合XSUB和zmq.proxy函数可以轻松构建高性能的消息代理。希望以上内容能帮助你理解和使用XPUB。
数组TOP-K问题:求前K个最小元素的多种解法与C++实现 目录 引言 问题定义 方法一:排序法(最直观) 思路 方法二:堆(优先队列)法 思路 复杂度分析: 方法三:快速选择法(Quick Select) 方法四:计… 2026/5/17 8:02:50
PCB金手指工艺揭秘 为何插拔万次仍接触良好 你有没有过这般的疑问:为何内存条、显卡上面被称作“金色手指”的部分,就算插拔了不计其数的次数,却依旧能保持良好的接触状况呢?这背后存在着精密材料科学与制造工艺之间的较量。什么是金手指(Connecting Finger&… 2026/5/17 8:02:41
pcb盲埋孔厂家排名 树脂塞孔工艺评测 “你手中的手机,还有笔记本,那般不断变薄起来,功能却持续变强了,幕后有着至关重要的英雄之一者,乃是PCB板之上的‘隐形通道’,这便是盲埋孔。”针对硬件工程师以及采购的人员而言,那种在有限的空… 2026/5/17 8:02:41
强化学习参数设置与优化实战指南 1. 强化学习参数设置的核心挑战在强化学习系统开发过程中,参数配置往往是最容易被低估却又最关键的一环。我见过太多项目因为参数设置不当而导致训练失败,即使算法本身非常优秀。参数就像强化学习系统的"隐形调节器",直接影响着智能… 2026/7/4 2:25:33
云服务器GPU训练深度学习模型实战指南 1. 为什么需要云服务器训练模型?训练深度学习模型对计算资源的需求往往超出个人电脑的承载能力。以常见的ResNet50模型为例,在ImageNet数据集上训练一轮(epoch)就需要处理128万张图片,使用单张RTX 3090显卡需要约30小时… 2026/7/4 2:25:33
AI全栈开发实战:前端开发者半小时构建完整应用 如果你是一名前端开发者,最近是否经常感到焦虑?一方面,前端技术栈日新月异,框架、工具链、构建配置让人应接不暇;另一方面,市场对“全栈能力”的要求越来越高,后端、数据库、部署运维的知识壁垒… 2026/7/4 2:23:33
昇腾AMCT工具链:跨框架模型量化实战指南 1. CANN AMCT工具链定位与技术背景昇腾AI处理器采用的达芬奇架构通过3D Cube矩阵计算单元实现高性能张量运算,其中INT8计算单元的理论吞吐量是FP16的2倍、FP32的4倍。AMCT(Ascend Model Compression Toolkit)作为CANN(Compute Arc… 2026/7/4 2:21:32
大模型学习路线与实战指南:从理论到应用 1. 大模型学习路线全景解析作为一名从传统机器学习转型到大模型领域的技术从业者,我完整经历了从困惑到入门再到实战的全过程。大模型技术栈与传统AI有显著差异,主要体现在三个维度:计算规模(千亿级参数)、数据需求&am… 2026/7/4 2:21:32
CRUD工程师如何转型AI开发:实战路径与工具链 1. 为什么CRUD程序员必须关注AI大模型?作为一名在技术行业摸爬滚打多年的老兵,我亲眼目睹了太多同行因为固守CRUD(增删改查)技术栈而逐渐被边缘化的案例。2023年ChatGPT的爆发只是一个开始,随后的Claude、Gemini等大模… 2026/7/4 2:19:31
STM32F745VG与MC6470 IMU的高性能姿态控制系统设计 1. MC6470与STM32F745VG的黄金组合解析在工业自动化和机器人控制领域,传感器与微控制器的协同工作能力直接决定了系统的响应速度和定位精度。MC6470作为一款6自由度惯性测量单元(6DOF IMU),与STM32F745VG这款基于ARM Cortex-M7内核的高性能微控制器组合&… 2026/7/4 0:00:28
Playwright自动化测试实战:从零搭建现代Web测试框架 1. 项目概述:为什么是 Playwright?如果你正在为现代 Web 应用的自动化测试头疼,尤其是面对那些充斥着动态加载、复杂交互的单页应用(SPA),那么 Playwright 的出现,很可能就是你的解药。我接触过… 2026/7/4 0:00:28
终极指南:如何将JSXBIN二进制文件转换为可读JSX源代码 终极指南:如何将JSXBIN二进制文件转换为可读JSX源代码 【免费下载链接】jsxbin-to-jsx-converter JSXBin to JSX Converter written in C# 项目地址: https://gitcode.com/gh_mirrors/js/jsxbin-to-jsx-converter 你是否曾经面对过Adobe产品的JSXBIN文件感到… 2026/7/4 0:02:28