2016-04-25 11 views
0

Ich versuche, ipyparallel als eine Alternative zu der multiprocessing in meiner Master - Slaves - Architektur zu integrieren.Freigeben von Warteschlangen mit ipyparallel Cluster

nämlich zur Zeit alle Prozesse haben zwei Warteschlangen:

  • Eine für Aufgaben vom Master zum Slave
  • Einer für Ergebnisse von Sklaven zu meistern.

Momentan verwende ich multiprocessing.Manager().Queue() Warteschlangen für die Kommunikation. Es scheint jedoch, dass sie nicht mit den ipyparallel Prozessen geteilt werden können.

Der Grund, warum ich das überhaupt (und nicht nur über Funktionen) mache, ist, weil das "Einrichten" der Arbeiter von Grund auf fast so teuer ist (rechnerisch) wie die Berechnung. Ich würde lieber eine Funktion (über map_async oder ähnliches) ausführen, die die Umgebung auf den Arbeitern einrichten würde, die erste Berechnung durchführen, die Ergebnisse in die Ergebniswarteschlange schieben und dann (erheblich kleinere) Aktualisierungen von der Aufgabenwarteschlange holen und wiederholen die letzten paar Schritte bis zum Anhalten (wieder über die Warteschlange).

Wenn es einen besseren Ansatz/Rahmen für diese Art von Aufgabe gibt (es muss jedoch Python sein), bin ich ganz Ohr.

Dank

Antwort

2

Mit IPython parallel ist es üblich, mit einem Direct zu tun „Setup“, dann kleinere Aufgaben verteilen, die als Funktionen auf einen Lastenausgleich Ansicht weitergegeben dieser Einrichtung abhängen.

Client und Ansichten ein:

import ipyparallel as ipp 

rc = ipp.Client() 
dview = rc[:] 
lbview = rc.load_balanced_view() 

Sie Ihr Setup mit dem direkten Blick:

def task(data): 
    analyze(data) 

rdata = ipp.Reference('data') 
ar = view.apply(task, rdata) 
result = ar.get() 
:

dview.execute("data = setup()") 

Sie nun an, dass ipp.Reference mit in Ihre Aufgaben verlassen können

Auf diese Weise können Sie das Setup einmal überall durchführen und dann Tasks ausführen, von denen Sie abhängig sind das Setup in einer Last ausgeglichenen Weise.