我很担心poller在zmq中实际做了什么.zguide最低限度地进入它,并且仅将其描述为从多个套接字读取的方式.这对我来说不是一个令人满意的答案,因为它没有解释如何使用超时套接字.我知道zeromq:如何防止无限期等待?解释推/拉,但不是req/rep模式,这是我想知道如何使用.
我试图问的是:poller如何工作,它的功能如何应用于跟踪套接字及其请求?
raf*_*ian 60
当您需要在同一个线程中侦听不同的套接字时,请使用轮询器:
ZMQ.Socket subscriber = ctx.socket(ZMQ.SUB)
ZMQ.Socket puller = ctx.socket(ZMQ.PULL)
Run Code Online (Sandbox Code Playgroud)
使用poller注册套接字(POLLIN侦听传入的消息)
ZMQ.Poller poller = ZMQ.Poller(2)
poller.register(subscriber, ZMQ.Poller.POLLIN)
poller.register(puller, ZMQ.Poller.POLLIN)
Run Code Online (Sandbox Code Playgroud)
轮询时,使用循环:
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)
}
Run Code Online (Sandbox Code Playgroud)
选择你想要的方式...
poller.poll()阻塞,直到任何一个套接字都有数据.
poller.poll(1000)阻止1秒,然后超时.
轮询器通知套接字上何时有数据(消息); 阅读它是你的工作.
阅读时,不要阻止:socket.recv( ZMQ.DONTWAIT).即使poller.pollin(0)检查是否有要读取的数据,您仍希望避免轮询循环内的任何阻塞调用,否则,由于"卡住"套接字,您最终可能会阻止轮询器.
因此,如果发送两个单独的消息subscriber,则必须调用subscriber.recv()两次才能清除轮询器,否则,如果调用subscriber.recv()一次,轮询器将继续告诉您还有另一条消息要读取.因此,从本质上讲,轮询器会跟踪消息的可用性和数量,而不是实际消息.
您应该浏览轮询示例并使用代码,这是学习的最佳方式.
这是否回答你的问题?