Multiprocessing mit mehreren Argumenten für Funktion in Python 2.7
Ich versuche, umzusetzen multiprocessing, um die Geschwindigkeit eines Replikations-Schleife, aber nicht in Python27. Dies ist eine sehr vereinfachte version von meinem Programm, basierend auf die docs und die anderen Antworten hier SO (z.B. Python-multiprocessing-pool.anzeigen für multiple Argumente). Ich weiß, dass es eine Reihe von quesions auf multiprocessing, aber so weit ich habe nicht in der Lage, dieses Problem zu lösen. Hoffentlich habe ich nicht übersehen, etwas zu trivial.
Code
import itertools
from multiprocessing import Pool
def func(g, h, i):
return g + h + i
def helper(args):
args2 = args[0] + (args[1],)
return func(*args2)
pool = Pool(processes=4)
result = pool.map(helper, itertools.izip(itertools.repeat((2, 3)), range(20)))
print result
Dies funktioniert bei Verwendung von map(...)
, aber nicht, wenn mit pool.map(...)
.
Fehlermeldung:
Process PoolWorker-3:
Traceback (most recent call last):
File "C:\Program_\EPD_python27\lib\multiprocessing\process.py", line 258, in _
bootstrap
self.run()
File "C:\Program_\EPD_python27\lib\multiprocessing\process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "C:\Program_\EPD_python27\lib\multiprocessing\pool.py", line 85, in worker
task = get()
File "C:\Program_\EPD_python27\lib\multiprocessing\queues.py", line 376, in get
return recv()
AttributeError: 'module' object has no attribute 'helper'
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist das problem gelöst, indem ein
main()
Funktion als:Basiert auf der Antwort von @ErikAllik ich denke, dass dies vielleicht ein Windows-spezifisches problem.
Bearbeiten: Hier ist eine klare und informative tutorial auf multiprocessing in python.
multiprocessing
.Es ist ein fork von
multiprocessing
genannt pathos (Hinweis: verwenden Sie die version auf github), dass muss nichtstarmap
oder Helfer oder alle die anderen Sachen -- die map-Funktionen spiegeln die API für python-anzeigen, also anzeigen können mehrere Argumente. Mitpathos
können Sie auch in der Regel tun, multiprocessing, bei dem der Dolmetscher, anstatt stecken in der__main__
block.pathos
ist fällig für eine Veröffentlichung, nach einigen milden Aktualisierung-vor allem Umstellung auf python 3.x.Auf meinem OS X, Python 2.7, Ihre code-Ausgänge:
Kann ich sehen, Ihre Python-Pfade enthalten
EPD_python27
, so vielleicht versuchen Sie es mit einem vanila Python Verteilung, nicht Enthought Python-Distribution.UPDATE: siehe @fileunderwater Antwort für eine Lösung; ich habe dieses mal mich selbst, hatte aber Total vergessen 🙂
Erklärung: Das problem tritt (nur in Windows aus irgendeinem Grund, kann aber auch das geschehen auf OS X und Linux), weil das Modul enthält eine top-level-code. Was
multiprocessing
tut, ist, dass die Einfuhren Ihren code in das subprocess und führt es. Allerdings, wenn das Modul enthält eine top-level-code, es wird ausgewertet/ausgeführt wird, sofort als das Modul wird importiert. Wickeln Sie es inmain
und nur aufrufenmain()
bedingt (d.h. mit einerif __name__ == '__main__'
block), du bist dies zu verhindern. Auch das ist nicht korrekt auf OS X und Linux, und ist in der Regel immer vorgezogen, putting-code direkt im Modul.