2012-02-21 1 views
4

Je souhaite limiter la quantité de mémoire consommée par mes files d'attente de messages ZeroMQ dans une application Python. Je sais que le fait de placer la marque des hautes eaux limitera la quantité qui sera mise en file d'attente du côté de l'expéditeur, mais y a-t-il un moyen de contrôler combien sera mis en file d'attente du côté du receveur? La liaison Python ZeroMQ semble l'avoir illimitée.Limitation de la longueur de la file d'attente avec PyZMQ

Mon scénario de test: J'ai deux terminaux python que j'utilise pour tester. L'un est le récepteur:

Python 2.5.1 (r251:54863, Aug 25 2008, 20:50:04) 
[GCC 4.1.2 20071124 (Red Hat 4.1.2-42)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import zmq.core 
>>> context=zmq.Context() 
>>> socket = context.socket(zmq.PULL) 
>>> socket.setsockopt(zmq.RCVBUF, 256) 
>>> socket.bind("tcp://127.0.0.1:12345") 

L'autre est l'expéditeur:

Python 2.5.1 (r251:54863, Aug 25 2008, 20:50:04) 
[GCC 4.1.2 20071124 (Red Hat 4.1.2-42)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import zmq.core 
>>> context=zmq.Context() 
>>> socket = context.socket(zmq.PUSH) 
>>> socket.setsockopt(zmq.SNDBUF, 2048) 
>>> socket.setsockopt(zmq.HWM, 1) 
>>> socket.connect("tcp://127.0.0.1:12345") 
>>> num = 0 
>>> while True: 
... print num 
... socket.send(str(num)) 
... num = num + 1 
... 

je lance socket.recv() sur le côté récepteur une ou deux fois pour vous assurer que la file d'attente fonctionne, mais à part ça, laissez deux terminaux restent juste là. La boucle d'envoi semble ne jamais bloquer et l'invite de réception semble avoir une empreinte mémoire croissante.

Répondre

3

Contrairement à la documentation de ZeroMQ, la marque de haute mer doit être réglée à la fois du côté PUSH et du côté PULL. Une fois que j'ai changé le PULL, ça a mieux marché. Le nouveau code PULL est:

Python 2.5.1 (r251:54863, Aug 25 2008, 20:50:04) 
[GCC 4.1.2 20071124 (Red Hat 4.1.2-42)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import zmq.core 
>>> context=zmq.Context() 
>>> socket = context.socket(zmq.PULL) 
>>> socket.setsockopt(zmq.RCVBUF, 256) 
>>> socket.setsockopt(zmq.HWM, 1) 
>>> socket.bind("tcp://127.0.0.1:12345") 
0

En fait, la documentation dit ceci:

« Quand une prise ZMQ_PUSH entre dans un état d'exception en raison d'avoir atteint la marque de haute eau pour tous les nœuds en aval, ou s'il n'y a aucun noeud en aval, toutes les opérations zmq_send (3) sur le socket doivent être bloquées jusqu'à la fin de l'état exceptionnel ou au moins un noeud en aval devient disponible pour l'envoi, les messages ne sont pas mis au rebut. "

http://api.zeromq.org/2-1:zmq-socket

Quels sont les Etats pur et simple que vous pouvez (et devez) placer la marque de haute eau pour les noeuds en aval (tirer aka), et sous-entend peut-être que la mise sur le côté poussoir n'a aucun effet (même si Je suppose que ce n'est pas vrai, car il y a toujours le cas où les nœuds en aval sont disponibles mais les messages arrivent plus vite qu'ils ne peuvent être envoyés.)

Questions connexes