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.
InformationsquelleAutor Jzl5325 | 2012-08-07
Schreibe einen Kommentar