Wie kann ich dies vermeiden, Beizen Fehler, und was ist der beste Weg zu parallelisieren Sie diesen code in Python?
Ich habe den folgenden code.
def main():
(minI, maxI, iStep, minJ, maxJ, jStep, a, b, numProcessors) = sys.argv
for i in range(minI, maxI, iStep):
for j in range(minJ, maxJ, jStep):
p = multiprocessing.Process(target=functionA, args=(minI, minJ))
p.start()
def functionB((a, b)):
subprocess.call('program1 %s %s %s %s %s %s' %(c, a, b, 'file1',
'file2', 'file3'), shell=True)
for d in ['a', 'b', 'c']:
subprocess.call('program2 %s %s %s %s %s' %(d, 'file4', 'file5',
'file6', 'file7'), shell=True)
abProduct = list(itertools.product(range(0, 10), range(0, 10)))
pool = multiprocessing.Pool(processes=numProcessors)
pool.map(functionB, abProduct)
Produziert den folgenden Fehler.
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib64/python2.6/threading.py", line 532, in __bootstrap_inner
self.run()
File "/usr/lib64/python2.6/threading.py", line 484, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/lib64/python2.6/multiprocessing/pool.py", line 255, in _handle_tasks
put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function fa
iled
Den Inhalt funktionalisierte unwichtig sind, und nicht wird ein Fehler erzeugt. Der Fehler scheint aufzutreten, wenn ich versuche die Karte functionB. Wie Entferne ich diese Fehlermeldung, und was ist der beste Weg zu parallelisieren Sie diesen code in Python 2.6?
- Einfach Fragen... Was ist der Zweck der mit dem multiprocessing-Modul hier, wenn Sie sich auf jeden Prozess können Sie starten...im Grunde laufen Sie abwechselnd.
- möglich, Duplikat der Can nicht Gurke <geben Sie 'instancemethod'> bei der Verwendung von python-multiprocessing-Pool.map()
functionB
möglicherweise in der Datei-level-Bereich, nicht in den Anwendungsbereich. Versuchen Sie es dort.- Hier ist die Antwort stackoverflow.com/questions/1816958/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Grund, den Sie wahrscheinlich sehen, dieses Verhalten ist aufgrund der Reihenfolge, in der Sie definieren Ihren pool, Objekte und Funktionen.
multiprocessing
ist nicht ganz das selbe wie mit threads. Jeder Prozess spawnt und laden Sie eine Kopie der Umgebung. Wenn Sie Funktionen erstellen, die in Bereichen, die nicht zur Verfügung, um die Prozesse oder Objekte erstellen, bevor Sie den pool, dann ist der pool wird scheitern.Zunächst versuchen, die Schaffung eines Pools vor Ihrem großen Schleife:
Verschieben Sie dann Ihr Ziel callable außerhalb der dynamic loop:
Beispiel...
gebrochen
arbeiten