8
votes

Python Zeromq - Plusieurs éditeurs à un seul abonné?

J'aimerais écrire un script python (appelez-le parent ) qui suit:

(1) définit un tableau multidimensionnel numpy tableau

(2) Fourches 10 python Les scripts (appelez-les enfants ). Chacun d'entre eux doit pouvoir lire le contenu de la matrice numpy de (1) à un moment donné (tant qu'ils sont vivants).

(3) chacun des scripts enfants fera son propre travail ( enfants ne partage aucune information les uns avec les autres)

(4) à tout moment de temps, le script parent doit être capable d'accepter des messages de tous ses enfants . Ces messages seront analysés par le parent et causer le tableau numpy de (1) à changer.


Comment puis-je aller à ce sujet, lorsque vous travaillez dans Python dans un linux environnement? J'ai pensé utiliser zeromq et avoir le parent être un seul l'abonné tandis que les enfants seront tous éditeurs ; a-t-il de sens ou y a-t-il une meilleure façon pour cela?

Aussi, comment puis-je permettre à tous les enfants de lire le contenu du tableau numpy défini par la parent ?


1 commentaires

Avez-vous envisagé d'utiliser le modèle Push / Pull, comme décrit dans zGuide.zeromq.org / Page: Tout # Divide-et-Conquer ? Seul le ventilateur et le puits sont le même processus ...


3 Réponses :


4
votes

Je pense qu'il est plus logique d'utiliser des sockets push / pull, car vous avez une standard Ventilateur - Travailleurs - Scénario de l'évier , sauf que le ventilateur et l'évier sont le même processus.

Aussi, envisagez d'utiliser le Multiperinging module au lieu de zeromq. Il sera probablement un peu plus facile.


2 commentaires

TSG, merci pour votre réponse. MultiProcessing est bon - mais puis-je l'utiliser pour partager un tableau numpy ? Mon objet partagé (idéalement, NUMPY NUMPY Array) aura une matrice de 20 000 000 x 5 éléments. Une liste régulière sera une énorme mémoire.


Aussi, comment puis-je partager le tableau Parent NUMPY pour la lecture entre tous les enfants ?



-2
votes

à Zeromq, il ne peut y avoir qu'un seul éditeur par port. La seule solution de contournement (laid) consiste à démarrer chaque prise de pub enfant sur un port différent et à écouter les parents sur tous ces ports.

Mais le modèle de pipeline décrit sur 0 mq, le Guide de l'utilisateur est un excellent moyen de le faire.


1 commentaires

Ce n'est pas assez précis. Vous ne pouvez que Bind une socket à un port, mais dans ce scénario, il n'y a aucune raison de ne pas se lier avec le sous et connectez tous les pubs à ce port. Zeromq ne se soucie pas du tout des instructions de liaison / Connect.



17
votes

Le canal SUB ne doit pas nécessairement être celui à lier, vous pouvez donc avoir la liaison de l'abonné, et chacun des enfants pub peut se connecter à cette et envoyer leurs messages. Dans ce cas particulier, je pense que le module multiprocessionnaire est un meilleur ajustement, mais je pensais que cela supporterait mentionner: xxx

en particulier, le Modèles de messagerie de base La partie de la documentation aborde le fait que les schémas, de chaque côté peuvent se lier (et l'autre connexion).


5 commentaires

Je pense que vous voulez dire ... "Le canal de pub n'a pas besoin d'être celui qui se lie"


J'ai copié cela en un script de py et je l'ai couru. Il se bloque simplement sur la commande RECV et n'imprime rien.


C'est probablement parce que vous n'avez pas attendu la connexion à la fin. J'ai ajouté le temps.sleep (0.1) après la connexion et cela a fonctionné.


Travailler pour moi sur un sous-réseau entre les nœuds


Notez que vous n'aurez probablement pas l'expérience d'une excellente performance, car le GIL réduit les chances que vos threads fonctionnent vraiment en parallèle. Comme mentionné ci-dessus, vous pouvez éviter cela en utilisant le module multiprocessionnaire . Voir par exemple videysqua.re/blog/grok-the-gil-fast -Trread-Safe-Safe-Python Pour une bonne explication de la gil.