当你需要在同一个线程中的不同套接字上侦听时,使用poller:
ZMQ.Socket subscriber = ctx.socket(ZMQ.SUB)
ZMQ.Socket puller = ctx.socket(ZMQ.PULL)
使用轮询器注册套接字(POLLIN侦听传入的消息)
ZMQ.Poller poller = ZMQ.Poller(2)
poller.register(subscriber, ZMQ.Poller.POLLIN)
poller.register(puller, ZMQ.Poller.POLLIN)
当轮询时,使用循环:
while( notInterrupted()){
poller.poll()
//subscriber registered at index '0'
if( poller.pollin(0))
subscriber.recv(ZMQ.DONTWAIT)
//puller registered at index '1'
if( poller.pollin(1))
puller.recv( ZMQ.DONTWAIT)
}
选择您要轮询的方式…
poller.poll()阻塞,直到有任何套接字上的数据。
poller.poll(1000)块为1,然后超时。
轮询器在套接字上有可用的数据(消息)时通知;它是你的工作,阅读它。
读取时,不要阻塞:socket.recv(ZMQ.DONTWAIT)。即使poller.pollin(0)检查是否有要读取的数据,你想避免在轮询循环内的任何阻塞调用,否则,你可能最终阻塞poller由于“卡住”套接字。
因此,如果两个单独的消息发送到订阅者,您必须调用subscriber.recv()两次以清除轮询器,否则,如果您调用subscriber.recv()一次,轮询器将继续告诉您有另一个消息读取。因此,本质上,轮询器跟踪消息的可用性和数量,而不是实际消息。