通过zmq ipc发送现有的dict

问题描述 投票:0回答:3

我正在尝试通过 zmq ipc 套接字发送现有的字典,我可以使用此代码发送字符串,但我无法发送字典对象

import zmq, datetime

d = {0: ('356612022462768', 'EVENT', 0, '2012-12-26 15:50:16', -20.22216, -70.13723, 6.44, 134.0, 1, 2, '18743230', datetime.datetime(2013, 2, 10, 9, 6, 2, 362734))}

if __name__ == "__main__":
    context = zmq.Context()
    publisher = context.socket(zmq.PUB)
    publisher.connect("ipc://shared")
    while True:
        publisher.send( d )
        time.sleep( 1 )

TypeError: {0: ('356612022462768', 'EVENT', 0, '2012-12-26 15:50:16', 
           -20.22216, -70.13723, 6.44, 134.0, 1, 2, '18743230', 
           datetime.datetime(2013, 2, 10, 9, 6, 2, 362734))} 
does not provide a buffer interface.

我该怎么做?

python zeromq
3个回答
13
投票

只能通过开箱即用的 ZeroMq 发送字符串或字节数组。任何其他内容都需要先序列化,然后再传递给 ZeroMq 以在线传输。

您可以使用任何您喜欢的方式来序列化它,例如 Protocol Buffers、JSON 或 Message Pack。请注意,任何接收者都需要能够使用相同的协议反序列化数据。

您可以在此处找到有关如何将各种序列化技术(包括 numpy 数组)与 pyzmq 结合使用的示例。它们是 pyzmq 源的一部分。


8
投票

您需要序列化数据,可能会序列化为 JSON,具体取决于用例。你不能按原样发送它,你需要一个字符串表示

import json
myjson = json.dumps(d)

但是 datetime 对象不能简单地转换为 json,因此您必须单独处理它,这篇文章将对此有所帮助:Python 和 JavaScript 之间的 JSON 日期时间


0
投票

这里是您问题的解决方案:

import zmq, datetime
import json

d = {0: ('356612022462768', 'EVENT', 0, '2012-12-26 15:50:16', -20.22216, -70.13723, 6.44, 134.0, 1, 2, '18743230', datetime.datetime(2013, 2, 10, 9, 6, 2, 362734))}

if __name__ == "__main__":
    context = zmq.Context()
    publisher = context.socket(zmq.PUB)
    publisher.connect("ipc://shared")
    while True:
        publisher.send_string(json.dumps(d))
        time.sleep( 1 )

注意

json.dumps
为您提供一个字符串,因此您应该使用
send_string
而不是
send

© www.soinside.com 2019 - 2024. All rights reserved.