2

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.

Antwort

-1

Sie können versuchen, sys.setrecursionlimit() zu verwenden, die Grenze der Rekursion zu erhöhen, wie zum Beispiel:

import sys 
sys.setrecursionlimit(1000000) 
+0

dies eine schreckliche Idee ist, und die Symptom-Adressen aber nicht das Problem – avigil