2015-10-15 36 views
3

ZeroMQ提供有關如何建立一個pub-sub pattern與主題過濾器,如the api docs描述相當不錯的文檔。 ZeroMQ還爲convenience提供了方法socket.send_json()socket.send_pyobj()(和recv對應部分)。如何在ZeroMQ中調用recv_pyobj()時添加主題過濾器?

在發佈 - 訂閱例如,主題過濾器(字符串)被附加到消息(也字符串)的開頭。使用內置序列化時,有沒有辦法設置主題過濾器?如果我使用send_pyobj()發送dictClass,我不能在它前面附加一個字符串。

回答

3

首先要注意的是,ZeroMQ不提供send_json()send_pyobj()作爲便利方法,它們是由pyzmq綁定提供的。所以,ZMQ並不知道這些數據類型的任何內容 - 基本上發生的是這些方法只是對數據進行序列化和非序列化。

和你一樣,我還沒有看到發佈/訂閱的這些方便的方法,那不只是訂閱''工作只舉一個例子。但是,它應該是可能的,如果有點黑客這樣做。

正如你可以see here in the sourcesend_pyobj()使用pickle序列化數據。您可以使用該事實來查看一旦序列化後數據的外觀。您可以添加額外的元素到您的dictClass,只要進去序列化的字符串第一你可以肯定,再看看系列化和只使用字符串的開始,因爲你的訂閱主題。如果您不能肯定您的主題元素將是第一位的,那麼你就必須建立某種你有更多的控制權的一個信封,併發送裏面坐了你的數據,只是解引用它的時候你收到它。

哈克,醜陋,最終可能是一個壞主意,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'] 
+0

很不錯的答案。謝謝。 – Wapiti

相關問題