首先要注意的是,ZeroMQ不提供send_json()
或send_pyobj()
作为便利方法,它们是由pyzmq绑定提供的。所以,ZMQ并不知道这些数据类型的任何内容 - 基本上发生的是这些方法只是对数据进行序列化和非序列化。
和你一样,我还没有看到发布/订阅的这些方便的方法,那不只是订阅''
工作只举一个例子。但是,它应该是可能的,如果有点黑客这样做。
正如你可以see here in the source,send_pyobj()
使用pickle
序列化数据。您可以使用该事实来查看一旦序列化后数据的外观。您可以添加额外的元素到您的dict
或Class
,只要进去序列化的字符串第一你可以肯定,再看看系列化和只使用字符串的开始,因为你的订阅主题。如果您不能肯定您的主题元素将是第一位的,那么你就必须建立某种你有更多的控制权的一个信封,并发送里面坐了你的数据,只是解引用它的时候你收到它。
哈克,丑陋,最终可能是一个坏主意,even according to the writers of the pyzmq binding themselves - 相关报价(强调):
我们确实提供了为方便起见,3种内置的序列化方法,帮助Python开发人员学习libzmq .. 。这些方法是为了方便而设计的,而不是为了性能,所以那些想强调性能的开发者应该使用自己的序列化send/recv方法。
它可能是更好的,只是自己序列化数据,并发送适当的多帧消息与您的主题在第一帧。你可以找到这样的例子here。
// publisher
self.socket.send_multipart([b'status',pickle.dumps(msg2)])
// subscriber
socket.setsockopt(zmq.SUBSCRIBE, 'status')
[topic,msg] = socket.recv_multipart()
msg2 = pickle.loads(msg)
print msg2['game']
很不错的答案。谢谢。 – Wapiti