Ich habe eine Aufgabe, die ich mit Pathos parallelisieren möchte. Wenn ich eine nicht parallele Version ausführe, läuft es gut. Das Ausführen eines Pathospools mit 1 Prozess verursacht jedoch einen RuntimeError: Die maximale Rekursionstiefe wurde überschritten.Pathos Processing Pool Rekursionslimit
Zum Beispiel:
import pathos.multiprocessing as mp
pool = mp.ProcessPool(1)
def _worker(fx):
return fx[0](fx[1],fx[2])
In meinen Versuchen zu debuggen, warum dieser Fehler auftreten wird, habe ich versucht, eine Liste von einem Objekt zuordnen. Dies funktioniert ohne Multiprozessing
>>> map(_worker, izip([t1.getValue], repeat(a_all), repeat(penalties)))
[-0.34375]
Wo t1.getValue
die teure Funktion angewendet werden soll. Ich habe eine ganze Liste dieser expesiven Funktionen, die auf dieselben zwei Argumente angewendet werden. Hier wird die parallele Verarbeitung kommt jedoch den Fehler folgendermaßen wirft.
>>> pool.map(_worker, izip([t1.getValue], repeat(a_all), repeat(penalties)))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/site-packages/pathos/multiprocessing.py", line 136, in map
return _pool.map(star(f), zip(*args)) # chunksize
File "/usr/local/lib/python2.7/site-packages/multiprocess/pool.py", line 251, in map
return self.map_async(func, iterable, chunksize).get()
File "/usr/local/lib/python2.7/site-packages/multiprocess/pool.py", line 567, in get
raise self._value
RuntimeError: maximum recursion depth exceeded
Was interessant ist, dass getValue
nicht rekursiv ist. Ich weiß, dass dies manchmal passiert, wenn das Stacklimit erreicht ist.
Wie finde ich heraus, welcher Teil von getValue
den Fehler verursacht, um Multiprocessing zu erhalten? Ich stehe fest, weil ich nicht weiß, wie ich das von diesem Punkt aus debuggen soll. Ist es möglich, dass dies tatsächlich durch einen Beizfehler verursacht wird, wenn Daten an Prozesse übergeben werden? getValue
behandelt einige große Strukturen hinter den Kulissen.
dies eine schreckliche Idee ist, und die Symptom-Adressen aber nicht das Problem – avigil