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

如何在Python中创建ZeroMQ(pyzmq)套接字/上下文的动态列表或数组?

优雅管理多个ZeroMQ套接字的Python实现

你可以通过列表/字典存储设备配置,结合循环动态创建套接字,同时复用单个ZeroMQ上下文(这是ZeroMQ的推荐实践,单个上下文可高效管理多个套接字,无需为每个设备单独创建)。

基础优化方案(列表管理)

import zmq

# 集中定义所有设备的连接地址
device_endpoints = [
    "tcp://10.20.1.1:7771",
    "tcp://10.20.1.2:7772",
    "tcp://10.20.1.3:7773"
    # 新增设备直接追加地址即可
]

# 创建单个ZeroMQ上下文(全局复用,避免资源浪费)
context = zmq.Context()

# 循环生成套接字并统一存储
device_sockets = []
for endpoint in device_endpoints:
    sock = context.socket(zmq.SUB)  # 若使用PAIR模式,替换为zmq.PAIR
    sock.connect(endpoint)
    # 若是SUB模式,需设置订阅规则,例如 sock.subscribe("") 接收所有消息
    device_sockets.append(sock)

进阶方案(带标识的字典管理)

如果需要给设备绑定自定义标识(比如设备ID),用字典存储更便于后续按标识调用:

import zmq

# 每个设备配置包含标识和连接地址
device_configs = [
    {"id": "device1", "endpoint": "tcp://10.20.1.1:7771"},
    {"id": "device2", "endpoint": "tcp://10.20.1.2:7772"},
    {"id": "device3", "endpoint": "tcp://10.20.1.3:7773"}
]

context = zmq.Context()
device_sockets = {}

for config in device_configs:
    sock = context.socket(zmq.SUB)
    sock.connect(config["endpoint"])
    device_sockets[config["id"]] = sock

# 后续可直接通过设备ID获取套接字
# device_sockets["device1"].recv()

资源清理注意事项

程序退出前,记得统一关闭套接字和上下文,避免资源泄漏:

# 关闭所有套接字
for sock in device_sockets.values() if isinstance(device_sockets, dict) else device_sockets:
    sock.close()

# 终止ZeroMQ上下文
context.term()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 13:42:11