zmq poller如何工作?

use*_*508 43 sockets zeromq

我很担心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()一次,轮询器将继续告诉您还有另一条消息要读取.因此,从本质上讲,轮询器会跟踪消息的可用性和数量,而不是实际消息.

您应该浏览轮询示例并使用代码,这是学习的最佳方式.

这是否回答你的问题?