multiprocessing mit Klassen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DaSch
User
Beiträge: 72
Registriert: Mittwoch 28. März 2007, 20:04
Kontaktdaten:

Hey Leute, also ich bin grad am verzweifeln was multiprocessing und klassen angeht. Irgendwie bekomme ich die Funktionen da nicht richtig übergeben. Hier funktioniert weder das mit dem self.f noch das f alleine. Obwohl beides ja richtige Funktionen sind. Ich hab natürlich mit dem ein oder anderen ausgeklammert probiert.

Das ist nur ein Testausschnitt. Über den pool sollen in meinem eigentlichen Programm dann Funktionen ausgeführt werden. Ich wollte das jetzt einfach hier mal etwas vereinfachen.

Nun meine frage wie ich die Funktion da richtig für das multiprocessing aufgerufen bekomme. Und ohne Klassen zu Arbeiten ist keine Lösung!

Code: Alles auswählen

import multiprocessing

class MultiProcess:
    def runMultiProcess(self):
        def f(x):
            return x*x
        pool = multiprocessing.Pool()
        print(pool.map(f, range(10)))
        print(pool.map(self.f, range(10)))
    def f(self, x):
        return x*x

if __name__ == '__main__':
    main = MultiProcess()
    main.runMultiProcess()
deets

DaSch hat geschrieben: Und ohne Klassen zu Arbeiten ist keine Lösung!
Das hier waere eine:

Code: Alles auswählen

import multiprocessing
class Foo(object):

    def __init__(self, state):
        self.state = state


    def compute(self):
        return self.state ** 2

    
def f(o):
    return o.compute()

class MultiProcess:

    def runMultiProcess(self):
        pool = multiprocessing.Pool()
        print(pool.map(f, (Foo(x) for x in xrange(10))))

    
if __name__ == '__main__':
    main = MultiProcess()
    main.runMultiProcess()
 
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Wesentlich ist das die Argumente an multiprocessing-Funktionen pickable sind (genaue Einschränkungen siehe Doku). Diese Eigenschaft erfüllt f() (MultiProcess aus dem zweiten Beispiel ist nicht strikt notwendig), aber Deine f()-funktionen, DaSch, erfüllen die Anforderung nicht (Du müsstest auch einen entsprechenden Fehler erhalten haben).

(Ehrlich gesagt finde ich das auch ein Riesenmanko des multiprocessing-Moduls und das man openmp in C/C++-Code für Python nicht nutzen kann finde ich noch doofer, aber was soll man machen ... )

Gruß,
Christian
Antworten