Quelle est la manière la plus correcte d'établir une communication bidirectionnelle entre les processus utilisant 0mq? J'ai besoin de créer plusieurs processus d'arrière-plan qui vont attendre les commandes du processus principal, effectuer quelques calculs et renvoyer le résultat au processus principal.Connexion un-à-plusieurs 0mq
Répondre
Il y a quelques façons de le faire. L'approche la plus directe pourrait consister à utiliser les sockets REQ
/REP
. Chaque processus d'arrière-plan/travailleur aurait une prise REP
, et vous utilisez une prise REQ
pour communiquer avec eux:
import zmq
def worker(addr):
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind(addr)
while True:
# get message from boss
msg = socket.recv()
# ...do smth
# send back results
socket.send(msg)
if __name__ == '__main__':
# spawn 5 workers
from multiprocessing import Process
for i in range(5):
Process(target=worker, args=('tcp://127.0.0.1:500%d' % i,)).start()
Il faudrait se connecter à chaque travailleur de leur envoyer un message et retourner les résultats:
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect(worker_addr)
socket.send('message')
msg = socket.recv()
Une autre approche serait d'utiliser PUB
/SUB
pour déclencher des messages aux travailleurs et PUSH
/PULL
pour récolter les résultats:
import zmq
def worker(worker_id, publisher_addr, results_addr):
context = zmq.Context()
sub = context.socket(zmq.SUB)
sub.connect(publisher_addr)
sub.setsockopt(zmq.SUBSCRIBE, worker_id)
push = context.socket(zmq.PUSH)
push.connect(results_addr)
while True:
msg = sub.recv_multipart()[1]
# do smth, send off results
push.send_multipart([worker_id, msg])
if __name__ == '__main__':
publisher_addr = 'tcp://127.0.0.1:5000'
results_addr = 'tcp://127.0.0.1:5001'
# launch some workers into space
from multiprocessing import Process
for i in range(5):
Process(target=worker, args=('worker-%d' % i, publisher_addr, results_addr,)).start()
Pour diffuser une commande à un travailleur spécifique, vous feriez quelque chose comme:
context = zmq.Context()
pub = context.socket(zmq.PUB)
pub.bind(publisher_addr)
# send message to worker-1
pub.send_multipart(['worker-1', 'hello'])
Pull dans les résultats:
context = zmq.Context()
pull = context.socket(zmq.PULL)
pull.bind(results_addr)
while True:
worker_id, result = pull.recv_multipart()
print worker_id, result
Envisagez d'utiliser Request Reply Broker mais remplacez le socket REQ par le DEALER. Le DEALER n'est pas bloquant pour l'envoi et équilibrera automatiquement le trafic vers vos employés.
Dans l'image Client
serait votre main process
et Service A/B/C
sont background processes (workers)
. Main process
doit se lier à un point de terminaison. Workers
doit se connecter au point de terminaison du processus principal pour recevoir les éléments de travail.
Dans main process
conserver la liste des éléments de travail et envoyer l'heure. S'il n'y a pas de réponse pendant un certain temps, renvoyez simplement l'élément de travail, car worker
est probablement mort.
- 1. ZeroMQ/ØMQ/0MQ comment démarrer?
- 2. 0MQ Windows GUI meilleure pratique
- 3. 0MQ avec des fils verts?
- 4. 0mq comment obtenir l'adresse liée
- 5. Compilation zeroMQ (0MQ) pour l'utilisation sur l'iPhone
- 6. Pub/Sous-abonnement à un éditeur non-0MQ
- 7. 0MQ est-il un protocole, une couche ou les deux? Puis-je l'utiliser avec STOMP?
- 8. Erreur d'exécution avec la liaison 0MQ Haskell: getIntOpt: interrompu (appel système interrompu)
- 9. Pourquoi ce script Python 0MQ pour l'informatique distribuée se bloque-t-il à une taille d'entrée fixe?
- 10. .connexion de connexion 0net
- 11. Android - connexion et connexion
- 12. Connexion
- 13. Erreur de connexion - connexion refusée
- 14. Connexion HTTP Connexion Java-Android
- 15. Connexion DB sans connexion active?
- 16. Connexion postgresql localhost - Connexion refusée
- 17. Connexion de la connexion à la connexion JDBC par thread
- 18. Drupal Connexion sans les champs de connexion
- 19. Résolution des problèmes de connexion PHP Connexion
- 20. Connexion de connexion locale AIR (Flex)
- 21. connexion HTTP permanente vs connexion socket TCP
- 22. Connexion MySQL constante ou Connexion au besoin
- 23. Connexion de la version Android Connexion SingleClientConnManager
- 24. Connexion sans afficher de page de connexion
- 25. PHP Connexion et connexion à MySql
- 26. vb.net connexion entité cadre connexion chaîne sécurité
- 27. PHP vs Java MySQL connexion de connexion
- 28. Détection d'une connexion Redis avant la connexion
- 29. Connexion SQL Server 2008 et connexion http?
- 30. problème de connexion connexion en utilisant SimpleTest