2011-09-22 3 views
1

J'essaie d'écrire une application qui permettra à l'utilisateur de lancer des processus de calcul de longue durée qui recevront des commandes d'un serveur web utilisant ØMQ. J'utilise l'architecture standart request-reply: le serveur a une socket REQ connectée à un socket REP. Lorsqu'une nouvelle commande est reçue d'un utilisateur, il est envoyé au processus de travail:ØMQ multithread REQ/REP

self.instance_dict[instance_id].socket.send(json_command) 
result = self.instance_dict[instance_id].socket.recv() 

Le problème apparaît lorsque la deuxième commande est envoyée alors que le premier est toujours en cours d'exécution. ØMQ offre-t-il des fonctionnalités qui prendront en charge les files d'attente de messages ou est-ce que je ne l'ai pas implémenté moi-même? Ou devrais-je changer l'architecture?

Répondre

3

Pour REQ/REP, la deuxième commande ne doit pas être envoyée avant que le premier n'ait été acquitté; ZMQ impose l'ordre correct des messages dans le protocole. Vous pouvez utiliser PUSH/PULL à la place - les messages seront automatiquement mis en file d'attente sans avoir besoin de réponse entre les deux (en passant, je pense que cela vous permet également d'utiliser plusieurs travailleurs pour la mise à l'échelle et l'équilibrage de charge).

Si vous utilisez un IOLoop, vous pouvez configurer ZMQStreams pour mettre en file d'attente les messages dans un processus. Voir https://github.com/zeromq/pyzmq/blob/master/zmq/eventloop/ioloop.py