Comment fonctionne ZMQ poller?

Je suis confus quant à ce que poller fait réellement dans zmq. Le zguide y va au minimum, et le décrit seulement comme un moyen de lire à partir de plusieurs sockets. Ce n'est pas une réponse satisfaisante pour moi, car elle n'explique pas comment le délai de sockets. Je sais zeromq: comment empêcher l'attente infinie? explique pour push / pull, mais pas les modèles req / rep, ce que je veux savoir utiliser.

Ce que j'essaie de demander est: comment fonctionne poller, et comment sa fonction s'applique-t-elle pour garder une trace des sockets et de leurs demandes?

39
demandé sur Community 2013-08-08 01:42:21

1 réponses

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)

Enregistrez 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 comment vous voulez interroger...

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

L'interrogateur avertit quand il y a des données (messages) disponibles sur les sockets; c'est votre travail de lire il.

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 blocage des appels à l'intérieur de la boucle d'interrogation, sinon, vous pourriez finir par bloquer le poller en raison de la socket 'stuck'.

Ainsi, si deux messages distincts sont envoyés à subscriber, vous devez invoquer subscriber.recv() deux fois pour effacer le poller, sinon, si vous appelez subscriber.recv() une fois, le poller gardera de vous dire il y a un autre message à lire. Donc, en substance, la 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.

Cela répond-il à votre question?

54
répondu raffian 2015-01-27 18:04:52