Python-Multiprocessing - Kann Nicht An Aktuellen Thread
Ich arbeite Segmentierung großen ctype-arrays und-Verarbeitung parallel. Ich erhalte den folgenden Fehler und glauben es, weil ein segment des Arrays ist die Verarbeitung beendet worden ist, bevor ein anderer. Ich habe versucht, mit Prozess.join() das erste set der Prozesse, die warten, aber das funktioniert nicht. Ideen?
Exception RuntimeError: RuntimeError('cannot join current thread',) in <Finalize object, dead> ignored
Mit:
....
with closing(multiprocessing.Pool(initializer=init(array))) as p:
del array #Since the array is now stored in a shared array destroy the array ref for memory reasons
step = y // cores
if step != 0:
jobs =[]
for i in range (0, y, step):
process = p.Process(target=stretch, args= (shared_arr,slice(i, i+step)),kwargs=options)
jobs.append(process)
process.start()
for j in jobs:
j.join()
del jobs
del process
Update:
#Create an ctypes array
array = ArrayConvert.SharedMemArray(array)
#Create a global of options
init_options(options) #options is a dict
with closing(multiprocessing.Pool(initializer=init(array))) as p:
del array #Since the array is not stored in a shared array destroy the array ref for memory reasons
step = y // cores
if step != 0:
for i in range (0, y, step):
#Package all the options into a global dictionary
p.map_async(stretch,[slice(i, i+step)])
#p.apply_async(stretch,args=(shared_arr,slice(i, i+step)),kwargs=options)
p.join()
def init_options(options_):
global kwoptions
kwoptions = options_
Die Funktion, dass ich mich übergeben map_async gespeichert ist, in einem anderen Modul, so dass ich kämpfen bin, um die Globale kwoptions übergeben, die Funktion. Es scheint nicht Recht zu übergeben globals um zwischen den Modulen wie folgt aus (unpythonic). Ist dies der Weg, um in der Lage sein, um pass kwargs durch map_async.
Sollte ich die Umarbeitung der multiprocessing mit etwas anderes (anwenden oder Prozess?)
- sollten Sie das nicht schaffen, neue Prozesse, wenn Sie Pool. Siehe ein Beispiel
- Danke für den link und für die Buchung, die Antwort - es hat geholfen. Ist es möglich, pass map_async eine Reihe von kwargs obwohl? Ich dachte, dass map_async single war arg nur( der Grund, warum ich ging mit Prozess). Ich denke, ich könnte wickeln Sie Sie mit einem lamdba und übergeben der Funktion als arg?
- Erstellen Sie einen wrapper als eine benannte Globale Funktion pass-Schlüsselwort args zu map_async.
- Sie können feststellen, dass bugs.python.org/issue15101 ist im Zusammenhang mit diesem und dass dieser behoben wird, was in Kürze 2.7.4.
Du musst angemeldet sein, um einen Kommentar abzugeben.
initializer
argument fürPool()
akzeptiert eine Funktion; ersetzeninitializer=init(array)
mitinitializer=init, initargs=(array,)
Übergeben keyword-Argumente zu Funktion
f()
verwendet mitpool.*map*
Familie, die Sie erstellen einen wrappermp_f()
:Also habe ich diese Arbeit durch Nacharbeit der code und entfernen von pool (nach J. F. Sebastians Kommentar).
In pseudo-code:
Hier ist der code, wenn das hilft keine googler:
mp.Pool
ermöglicht die separate Anzahl der worker-Prozesse und die Zahl der Arbeitsplätze also, die zum gleichen Arbeitsprozess in einem pool ausgeführt werden können mehrere Aufträge in der Reihenfolge.