You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否同时使用Python 2和Python 3搭建PubSub发布订阅通信架构?

Python2/Python3跨进程发布订阅通信失败问题解决方案

核心问题排查

你当前的方案存在两个核心问题:

  • PyPubSub是单进程内的消息通知组件,仅支持同一Python进程内的不同模块通信,完全不支持跨进程、跨Python版本运行时的消息传递,这是运行失败的核心原因
  • 代码存在低级逻辑错误:发布端发送消息的主题为topic,订阅端监听的主题为upload,主题不匹配,即使同进程运行也无法收到消息

适配迁移场景的解决方案

你要实现Py2遗留服务和Py3新服务的跨进程发布订阅通信,推荐使用Redis发布订阅能力实现,该方案轻量易部署,且客户端完美兼容Python2和Python3版本,完全匹配你逐步迁移的需求。

前置依赖

本地部署Redis服务,默认端口6379无密码即可,无需额外配置。

发布端(Python2)实现

  1. 安装兼容Py2的Redis客户端:
./venv/bin/pip install redis<3.0
  1. 改造后的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)实现

  1. 安装Py3版本Redis客户端:
./venv2/bin/pip install redis
  1. 改造后的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)

运行流程

  1. 启动本地Redis服务
  2. 运行订阅端:./venv2/bin/python py3subscriber.py
  3. 运行发布端:./venv/bin/python py2publisher.py

内容的提问来源于stack exchange,提问作者kevinlinxc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 07:09:02