2015-10-15 83 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