Vergleich des Multiprocessing-Moduls und Pyro?

8

Ich verwende pyro für die grundlegende Verwaltung paralleler Jobs in einem Rechencluster. Ich bin gerade in einen Cluster umgezogen, wo ich für die Verwendung aller Kerne auf jedem Rechenknoten verantwortlich sein werde. (Bei früheren Clustern war jeder Kern ein separater Knoten.) Das Python-Modul Multiprocessing scheint gut geeignet zu sein Dies. Ich stelle fest, dass es auch für Remote-Prozess-Kommunikation verwendet werden kann. Wenn jemand beide Frameworks für die Remote-Prozess-Kommunikation verwendet hat, wäre ich dankbar zu hören, wie sie aufeinander aufbauen. Der offensichtliche Vorteil des Multiprocessing-Moduls ist, dass es ab 2.6 integriert ist. Abgesehen davon fällt es mir schwer zu sagen, was besser ist.

    
Alex Coventry 23.07.2009, 13:34
quelle

1 Antwort

14

EDIT: Ich ändere meine Antwort, damit Sie Schmerzen vermeiden. Multiprozessing ist unausgereift, die Dokumente in BaseManager sind FALSCH , und wenn Sie ein objektorientierter Denker sind, der zur Laufzeit Laufzeitobjekte erstellen möchte, PYRO VERWENDEN ODER SIE WERDEN ERNSTSINNEND! Wenn Sie nur funktionale Programmierung mit einer gemeinsamen Warteschlange machen, die Sie im Voraus registrieren, wie all die dummen Beispiele GUT FÜR SIE.

Kurze Antwort

Mehrfachverarbeitung:

  • Fühlt sich merkwürdig objektorientierte Remote-Objekte an
  • Leicht luftiges Krypto (Authkey)
  • Über ein Netzwerk oder nur über prozessübergreifende Kommunikation
  • Kein Nameserver wie in Pyro (es gibt Möglichkeiten, dies zu umgehen)
  • Bearbeiten: Objekte können nicht registriert werden, nachdem der Manager instanziiert wurde !! ??
  • Bearbeiten: Wenn ein Server nicht gestartet wird, gibt der Client eine Ausnahme "Ungültiges Argument" aus, anstatt nur "WTF!" zu sagen. WTF!?
  • Bearbeiten: BaseManager-Dokumentation ist falsch! Es gibt keine "Start" -Methode!?!
  • Bearbeiten: Sehr kleine Beispiele, wie man es benutzt.

Pyro:

  • Einfache entfernte Objekte
  • Netzwerk kommuniziert nur (Loopback, wenn nur lokal)
  • Bearbeiten: Dieses Ding funktioniert einfach, und es mag objektorientierte Objektfreigabe, was mich LIKE it
  • macht
  • Bearbeiten: Warum ist das nicht ein Teil der Standard-Bibliothek, anstatt dieses Multiprocessing-Stück Mist, das versucht hat, es zu kopieren und kläglich versagt?

Bearbeiten: Als ich das erste Mal antwortete, war ich gerade in 2.6 Multiprocessing getaucht. In dem Code, den ich unten zeige, wird die Texture-Klasse als Proxy registriert und freigegeben, jedoch ist das "Daten" -Attribut innerhalb davon NICHT. Also rate mal, was passiert, jeder Prozess hat eine separate Kopie des Attributs "data" innerhalb des Texture-Proxy, trotz allem, was du erwartest. Ich habe gerade unzählige Stunden damit verbracht, herauszufinden, wie ein gutes Muster während der Laufzeit gemeinsame Objekte erzeugen kann, und ich lief immer wieder in die Wände. Es war ziemlich verwirrend und frustrierend. Vielleicht bin ich es nur, aber wenn ich mir die wenigen Beispiele ansehe, die die Leute versucht haben, sieht es nicht so aus.

Ich muss die schmerzhafte Entscheidung treffen, die Multiprocessing-Bibliothek fallen zu lassen und Pyro so lange zu bevorzugen, bis die Multiprocessing-Methode ausgereifter ist. Während ich anfänglich aufgeregt war, zu erfahren, dass Multiprocessing in Python eingebaut ist, bin ich jetzt völlig angewidert damit und würde lieber das Pyro-Paket viele Male mit Freude installieren, dass eine so schöne Bibliothek für Python existiert.

Lange Antwort

Ich habe Pyro in vergangenen Projekten benutzt und bin sehr glücklich damit. Ich habe auch begonnen, mit Multiprocessing neu in 2.6 zu arbeiten.

Mit Multiprocessing fand ich es ein wenig peinlich, freigegebene Objekte nach Bedarf erstellen zu lassen. Es scheint, als sei das Multiprocessing-Modul in seiner Jugend mehr auf funktionale Programmierung als auf objektorientierte Programmierung ausgerichtet. Dies ist jedoch nicht ganz richtig, weil es möglich ist, ich fühle mich nur durch die "Register" -Anrufe eingeschränkt.

Zum Beispiel:

manager.py:

%Vor%

server.py:

%Vor%

client.py:

%Vor%

Die Peinlichkeit, die ich beschreibe, kommt von server.py, wo ich eine getTexture-Funktion registriere, um eine Funktion eines bestimmten Namens aus dem TextureManager abzurufen. Wenn ich das hier durchführe, könnte die Ungeschicklichkeit möglicherweise beseitigt werden, wenn ich den TextureManager zu einem Objekt machen würde, das gemeinsam nutzbare Texturen erstellt / abruft. Meh ich spiele immer noch, aber du kommst auf die Idee. Ich kann mich nicht erinnern, mit Pyro auf diese Unbeholfenheit gestoßen zu sein, aber es gibt wahrscheinlich eine Lösung, die sauberer ist als das obige Beispiel.

    
manifest 23.12.2009 22:51
quelle

Tags und Links