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?
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?