2011-11-07 1 views
1

Je souhaite communiquer deux processus (expéditeur et destinataire) à l'aide de zeromq. Maintenant, si le processus de réception ne fonctionne pas, je voudrais que le processus de l'expéditeur continue son exécution, même si le message est perdu.Problème lors de l'implémentation d'un mécanisme de publication non bloquant avec zeromq

En essayant de l'implémenter en utilisant le modèle PUB-SUB, j'ai remarqué que si le récepteur ne fonctionne pas, l'expéditeur raccroche. Par exemple, dans le code source de l'expéditeur suivant:

import zmq 

context = zmq.Context() 
sender = context.socket(zmq.PUB) 
sender.connect("tcp://localhost:5555") 

sender.send("Sending to nobody", NOBLOCK) 

print "Msg sent" 

lorsque le récepteur est en panne, le message « Message envoyé » est jamais imprimé, et l'expéditeur reste dans « sender.send (» Envoi à personne », NOBLOCK)" pour toujours. En outre, j'ai essayé de vérifier si le récepteur est en haut ou pas le retour de la fonction connect, mais il est toujours "None" dans les deux cas.

J'utilise Python 2.6.5 et 2.1 ZeroMQ

Quelqu'un sait ce qu'il se passe ou une solution de rechange? (Je l'ai essayé d'utiliser PULL-PUSH et REQ-REP, mais des résultats similaires)

Merci beaucoup à l'avance

+0

Ce code ne s'exécute pas réellement (le symbole NOBLOCK n'est pas défini). Cela aide vraiment à écrire du code que les gens peuvent couper et coller. – larsks

Répondre

3

Après la fixation de votre échantillon:

import zmq 

context = zmq.Context() 
sender = context.socket(zmq.PUB) 
sender.connect("tcp://localhost:5555") 

sender.send("Sending to nobody", zmq.NOBLOCK) 

print "Msg sent" 

Le comportement que je vois est que le « Msg envoyé » phrase est imprimé, mais le script se bloque après cela et ne sort réellement. Le problème ici est qu'il est suspendu à l'appel système close().

Vous pouvez modifier ce comportement en définissant l'option LINGER sur votre prise:

sender = context.socket(zmq.PUB) 
sender.setsockopt(zmq.LINGER, 100) 

Cette valeur est ici le temps de Linger en millisecondes. Voir la page man pour zmq_setsockopt pour plus d'informations. L'impact pratique de ceci est que ZMQ n'attendra que s'attarder millisecondes avant de fermer le socket. Ne réglez pas cette valeur à trop trop faible, car cela entraînerait la perte de messages même si l'expéditeur écoute (car ZMQ peut fermer le socket avant la livraison du message).

+0

Désolé pour la faute de frappe – corto

+0

Pourquoi sender.close() et context.term() ne renvoient pas le code d'erreur quand reciver est en panne et que zmq.LINGER, vaut 100 ou plus? Ou comment puis-je maintenant cet envoi de message a échoué? – Ib33X

3

Vous pouvez facilement changer: sender.connect("tcp://localhost:5555")-sender.bind("tcp://localhost:5555") et vice-versa sur le récepteur.

Il vous donne la possibilité de connecter le récepteur où vous le souhaitez. L'expéditeur fonctionnerait peu importe s'il y a des récepteurs ou non.