能否同时使用Python 2和Python 3搭建PubSub发布订阅通信架构?
Python2/Python3跨进程发布订阅通信失败问题解决方案
核心问题排查
你当前的方案存在两个核心问题:
- PyPubSub是单进程内的消息通知组件,仅支持同一Python进程内的不同模块通信,完全不支持跨进程、跨Python版本运行时的消息传递,这是运行失败的核心原因
- 代码存在低级逻辑错误:发布端发送消息的主题为
topic,订阅端监听的主题为upload,主题不匹配,即使同进程运行也无法收到消息
适配迁移场景的解决方案
你要实现Py2遗留服务和Py3新服务的跨进程发布订阅通信,推荐使用Redis发布订阅能力实现,该方案轻量易部署,且客户端完美兼容Python2和Python3版本,完全匹配你逐步迁移的需求。
前置依赖
本地部署Redis服务,默认端口6379无密码即可,无需额外配置。
发布端(Python2)实现
- 安装兼容Py2的Redis客户端:
./venv/bin/pip install redis<3.0
- 改造后的
py2publisher.py代码:
import time import json import redis # 连接本地Redis服务 redis_conn = redis.Redis(host="127.0.0.1", port=6379, db=0) if __name__ == "__main__": while True: print("Sending message") # 序列化消息为JSON字符串发布 redis_conn.publish( "topic", json.dumps({"type": "video", "path": "/idk/idk/idk"}) ) redis_conn.publish( "topic", json.dumps({"type": "screenshot", "path": "/idk/idk/idk2"}) ) time.sleep(1)
订阅端(Python3)实现
- 安装Py3版本Redis客户端:
./venv2/bin/pip install redis
- 改造后的
py3subscriber.py代码:
import json import redis def topic_listener(payload): print("Received payload type: ", payload['type']) print("Payload path: ", payload['path']) if __name__ == "__main__": # 连接本地Redis服务 redis_conn = redis.Redis(host="127.0.0.1", port=6379, db=0) pubsub = redis_conn.pubsub() # 订阅对应topic主题 pubsub.subscribe("topic") # 循环监听消息 for message in pubsub.listen(): if message.get("type") == "message": # 反序列化JSON消息 payload = json.loads(message.get("data").decode("utf-8")) topic_listener(payload)
运行流程
- 启动本地Redis服务
- 运行订阅端:
./venv2/bin/python py3subscriber.py - 运行发布端:
./venv/bin/python py2publisher.py
内容的提问来源于stack exchange,提问作者kevinlinxc
相关产品推荐
相关产品推荐

