ZeroMQ和Python中的多个订阅过滤器

22

我想在Python中使用一个套接字订阅多个ZeroMQ过滤器。

sock.setsockopt(zmq.SUBSCRIBE, 'first.filter')
sock.setsockopt(zmq.SUBSCRIBE, 'second.filter')

但是这并不起作用。只有第一个被考虑。然而,我在zeromq网站上读到了以下内容:

多个过滤器可以附加到单个ZMQ_SUB套接字上,此时如果消息与至少一个过滤器匹配,则将接受该消息。

我正在使用的是zmq 2.2.0.1版本。那么,我想知道如何实现这一点。有任何想法吗?

1个回答

35

这个有效:

import time
import zmq

ctx = zmq.Context()
pub = ctx.socket(zmq.PUB)
sub = ctx.socket(zmq.SUB)

url = "tcp://127.0.0.1:5555"
pub.bind(url)
sub.connect(url)

# subscribe to 'a' and 'b'
sub.setsockopt(zmq.SUBSCRIBE, b'a')
sub.setsockopt(zmq.SUBSCRIBE, b'b')

time.sleep(1)

for word in [ 'alpha', 'beta', 'gamma', 'apple', 'carrot', 'bagel']:
    pub.send(word)

time.sleep(1)

for i in range(4):
    print sub.recv(zmq.NOBLOCK)

给出输出:

alpha
beta
apple
bagel

所以两种订阅方式都有效。你能提供具体的代码吗?也许问题出在其他地方。


嗨,感谢您的回答。确实有效,在我的情况下,我在发布者和订阅者之间使用了一个转发设备。禁用它可以使事情正常运行...仍在调查为什么转发设备会阻止使用多个过滤器... - Marc
好的,我回复自己,我的代码有点复杂,我弄乱了。现在完美运行了,谢谢! - Marc
如果您想知道在接收时捕获了哪个过滤器,该怎么办?例如,您是否接收了主题a或b?我正在使用jeromq。 - flexxxit
@Marc 我有完全相同的问题。我在我的发布者和订阅者之间也有XPUB和XSUB。当我在订阅者上订阅多个主题时,我只收到第一个主题的消息。你是如何解决这个问题的?你只是移除了代理吗? - doome161

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接