Python-multiprocessing: Wie Sie wissen, zu verwenden, den Pool oder Prozess?
So, ich habe eine Algorithmus, den ich Schreibe, und die Funktion multiprocess
soll eine andere Funktion aufrufen, CreateMatrixMp()
, auf wie viele Prozesse es gibt cpus, parallel. Ich habe noch nie getan, multiprocessing vor, und kann nicht sicher sein, welche eine der folgenden Methoden effizienter ist. Das Wort "effizient" im Kontext der Funktion CreateMatrixMp()
benötigen, um potenziell aufgerufen werden Tausende Male.Ich habe gelesen, die Dokumentation der python - multiprocessing
Modul, und sind gekommen, um diese zwei Möglichkeiten:
Erste ist mit der Pool
Klasse:
def MatrixHelper(self, args):
return self.CreateMatrix(*args)
def Multiprocess(self, sigmaI, sigmaX):
cpus = mp.cpu_count()
print('Number of cpu\'s to process WM: %d' % cpus)
poolCount = cpus*2
args = [(sigmaI, sigmaX, i) for i in range(self.numPixels)]
pool = mp.Pool(processes = poolCount, maxtasksperchild= 2)
tempData = pool.map(self.MatrixHelper, args)
pool.close()
pool.join()
Und die nächste ist mit der Process
Klasse:
def Multiprocess(self, sigmaI, sigmaX):
cpus = mp.cpu_count()
print('Number of cpu\'s to process WM: %d' % cpus)
processes = [mp.Process(target = self.CreateMatrixMp, args = (sigmaI, sigmaX, i,)) for i in range(self.numPixels)]
for p in processes:
p.start()
for p in processes:
p.join()
Pool
scheint die bessere Wahl sein. Ich habe gelesen, dass es verursacht weniger overhead. Und Process
berücksichtigt nicht die Anzahl der cpus auf der Maschine. Das einzige problem ist, dass mit Pool
in dieser Art und Weise gibt mir Fehler nach, und wenn ich das beheben, gibt es eine neue darunter. Process
scheint einfacher zu implementieren, und für alles, was ich weiß, es kann die bessere Wahl sein. Was macht Ihrer Erfahrung sagen Sie?
Wenn Pool
verwendet werden soll, dann bin ich Recht in der Wahl map()
? Es wäre bevorzugt, dass die Reihenfolge beibehalten wird. Ich habe tempData = pool.map(...)
weil die map
- Funktion soll, um eine Liste der Ergebnisse von jedem Prozess. Ich bin nicht sicher, wie Process
verarbeitet die zurückgegebenen Daten.
- Dies scheint ähnlich zu stackoverflow.com/questions/18176178/... vielen Dank
- Ich habe gelesen, dass post. Allerdings habe ich einige bitten, andere Fragen hier zu beantworten. Er wird mit zwei Ziel-Funktionen, während ich mich mit ein, er führt keine Argumente an, während ich pass mehrere, und er nicht besorgt zu sein mit seinem target wird eine Instanz-Methode, wie mir ist. Ich habe eine Menge Forschung auf diesem so weit, und beide
Pool
undProcess
scheinen, sich anders zu Verhalten in verschiedenen Kontexten, und es scheint sicher, dass einer besser wäre, in bestimmten Situationen, in anderen nicht. Ich dachte, es angebracht, starten Sie eine neue Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, die
Pool
Klasse ist in der Regel bequemer, aber es hängt davon ab, ob Sie möchten, dass Ihre Ergebnisse geordnet oder ungeordnet.Sagen, das Sie erstellen möchten 4 zufällige Zeichenfolgen (e.g,. könnte eine zufällige Benutzer-ID-generator oder so):
Hier, ist die Reihenfolge wohl egal. Ich bin nicht sicher, ob es einen besseren Weg, es zu tun, aber wenn ich will, die Ergebnisse in der Reihenfolge, in der die Funktionen aufgerufen werden, habe ich in der Regel zurück Tupel mit der ID als erstes Element, z.B.,
Dieses let ' s me Sortieren Sie die Ergebnisse dann:
Der Pool Klasse
Nun zu deiner Frage: Wie unterscheidet sich dies von der
Pool
Klasse?Sie würde bevorzugen in der Regel
Pool.map
zurück geordnete Liste der Ergebnisse ohne Umweg über den Reifen zu schaffen Tupel und sortiert Sie nach ID. Also, ich würde sagen, es ist in der Regel effizienter.Gleichwertig, es gibt auch eine "apply" - Methode:
Beide
Pool.apply
undPool.map
sperrt das Hauptprogramm, bis ein Prozess beendet wurde.Nun, Sie haben auch
Pool.apply_async
undPool.map_async
, die das Ergebnis zurückzugeben, sobald der Prozess abgeschlossen ist, die im wesentlichen ähnlich zu derProcess
Klasse vor. Der Vorteil kann sein, dass Sie Ihnen die bequemeapply
undmap
Funktionalität, dass Sie wissen, von Python eingebauteapply
undmap
Process
, die Anzahl der cpus kommt im nirgendwo. Wird diese behandelt werden, auf Ihre eigenen? Wird es zu etwas mehr Zeit zu gehen überProcess
? Ich möchteProcess
, undPool
ist mir eine sehr harte Zeit, mit all seinen pickle-Fehler, aberProcess
fühlt sich einfach nicht konkret genug sind, wiePool
tut.Process
. Ich habe es mitPool
, vielen Dank für deinen Rat, ich werde markieren Sie diese als beantwortet.