web-dev-qa-db-fra.com

Comment fonctionne zmq poller?

Je suis confus quant à ce que le poller fait réellement dans zmq. Le zguide y va de manière minimale et ne le décrit que comme un moyen de lire à partir de plusieurs sockets. Ce n'est pas une réponse satisfaisante pour moi car cela n'explique pas comment avoir des sockets de timeout. Je sais zeromq: comment éviter une attente infinie? explique pour Push/pull, mais pas les modèles req/rep, c'est ce que je veux savoir comment utiliser.

Ce que j'essaie de demander est: comment fonctionne le poller et comment sa fonction s'applique-t-elle au suivi des sockets et de leurs demandes?

42
user1876508

Lorsque vous devez écouter sur différentes sockets dans le même thread, utilisez un poller:

ZMQ.Socket subscriber = ctx.socket(ZMQ.SUB)
ZMQ.Socket puller = ctx.socket(ZMQ.PULL)

Enregistrer les sockets avec poller (POLLIN écoute les messages entrants)

ZMQ.Poller poller = ZMQ.Poller(2)
poller.register(subscriber, ZMQ.Poller.POLLIN)
poller.register(puller, ZMQ.Poller.POLLIN)

Lors de l'interrogation, utilisez une boucle:

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)
}

Choisissez la façon dont vous souhaitez interroger ...

poller.poll() bloque jusqu'à ce qu'il y ait des données sur l'une ou l'autre socket.
poller.poll(1000) bloque pendant 1 s, puis expire.

Le poller notifie quand des données (messages) sont disponibles sur les sockets; c'est votre travail de le lire.

Lors de la lecture, faites-le sans bloquer: socket.recv( ZMQ.DONTWAIT). Même si poller.pollin(0) vérifie s'il y a des données à lire, vous voulez éviter tout appel bloquant à l'intérieur de la boucle d'interrogation, sinon, vous pourriez finir par bloquer le poller en raison de la prise 'bloquée'.

Donc, si deux messages distincts sont envoyés à subscriber, vous devez appeler subscriber.recv() deux fois pour effacer le poller, sinon, si vous appelez subscriber.recv() une fois, le poller continuera à vous dire qu'il y a un autre message à lire. Donc, essentiellement, le poller suit la disponibilité et le nombre de messages, pas les messages réels.

Vous devriez parcourir les exemples d'interrogation et jouer avec le code, c'est la meilleure façon d'apprendre.

Est-ce que ça répond à votre question?

58
raffian