在Python中,发送像列表或字典这样的对象到zeromq,应该采用什么正确/最佳方法?
如果我们使用PUB/SUB模式,在字符串的第一部分作为过滤器,会发生什么情况?
- 我知道有多部分消息,但它们最初是为不同的目的而设计的。此外,您无法订阅所有第一个元素为特定字符串的消息。
手动序列化
将数据转换为字符串,串联或其他操作处理数据。这种方法速度快,占用空间少,但需要付出工作和维护的成本,并且不够灵活。
如果其他语言想要读取这些数据,则需要再编写代码。不能DRY。
对于非常小的数据,可以使用此方法,但通常情况下这种方式所需的工作量并不值得,除非您正在寻求速度和内存效率,并且可以测量您的实现与其他实现相比有显著优势。
Pickle
速度慢,但可以序列化复杂对象,甚至可调用。它很强大,而且使用起来非常简单。
另一方面,可能会得到无法进行序列化的对象而破坏你的代码。此外,您无法与使用其他语言编写的库共享数据。
最终,格式不易读(难以调试)且非常冗长。
非常适合共享对象和任务,但不适合消息。
JSON
速度相当快,适用于简单到中等复杂的数据结构的简单实现。它很灵活,人类可以读取数据,并且数据可以轻松地在各种语言之间共享。
对于复杂数据,您需要编写一些代码。
除非您有非常特定的需求,否则这可能是功能和复杂性之间的最佳平衡。尤其是因为Python库中的最新实现采用了C语言,速度也很快。
XML
冗长、难以创建,在没有重量级库辅助的情况下维护起来很痛苦。速度慢。
除非有要求,否则建议避免使用。
最后
现在通常情况下,速度和空间效率都相对而言,并且您必须先回答以下问题:
这就是所有的要紧之处。
那个美好哲学时刻已经过去了,使用JSON吧。
JSON:
# Client
socket.send(json.dumps(message))
# Server
message = json.loads(socket.recv())
更多信息:
这个问题中有几个问题,但是关于发送对象/字典的最佳/正确方法,显然取决于具体情况。对于许多情况来说,JSON 是简单且大多数人熟悉的方式。要使其工作,我必须使用 send_string
和 recv_string
。
# client.py
socket.send_string(json.dumps({'data': ['a', 'b', 'c']}))
# server.py
result = json.loads(socket.recv_string())
在文档中讨论 https://pyzmq.readthedocs.io/en/latest/unicode.html 相关的编程内容。