首先要注意的是,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