Seite 1 von 1

multiprocessing mit Klassen

Verfasst: Dienstag 14. Juni 2011, 16:02
von DaSch
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()

Re: multiprocessing mit Klassen

Verfasst: Dienstag 14. Juni 2011, 19:13
von 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()
 

Re: multiprocessing mit Klassen

Verfasst: Mittwoch 15. Juni 2011, 08:55
von CM
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