2017-10-26 1 views
1

Ich habe eine Liste von Klasseninstanzen. Jedes dieser Klassenobjekte hat eine Methodenfunktion, die ich ausführen möchte, und ich möchte über die Klasseninstanzen parallelisieren, da es eine Menge von ihnen gibt. Zum Beispiel habe ich diese Klasse Objekt:Übergabe einer Liste von Klasseninstanzen an multiprocessing.Pool und paralleles Ausführen der Methodenfunktion für jede Klassenobjekte

class Person(object): 
    def __init__(self, name): 
     self.name = name 
    def register(self): 
     self.registered = True 

Jetzt definiert ich eine Liste von Klasseninstanzen von Person()

persons = [Person(i) for i in ["Bernard", "Enrik", "Joseph"]] 

Ich möchte das Ausführen von Person.register() Methodenfunktion über den Werten in Personen parallelisieren. Mit Multiprocessing.Pool, hier ist was ich getan habe. Da Sie die Methodenfunktion nicht pürieren können, verpacke ich sie in eine andere Funktion.

import multiprocessing as mp 
def reg(person): 
    person.register() 
pool = mp.Pool(processes=mp.cpu_count()//2) 
res = list(pool.map(reg, persons)) 

Der Code läuft durch die Art und Weise, ohne Fehler, jetzt erwarte ich, dass jede Person Instanz in der Liste wird ein Attribut registered Satz True haben, aber wenn ich jede Klasse Instanz überprüfen, ist es nicht Attribut enthalten registered. Wenn zum Beispiel registered Überprüfung ist ein Attribut von Personen [0],

hasattr(persons[0], "registered") 
>>> False 

Warum ist das so? Wie kann ich das lösen?

+0

Sie haben die Karte. Das ist ein guter Anfang. Jetzt sammle es in einem Behälter und sei glücklich. 'liste (pool.map (reg, personen))' wäre mein erster versuch als 'liste (map (reg, personen))' wird das attribut für alle deine '' '' personen setzen;) – Uvar

+0

Meinst du soll ich sagen eine return-Anweisung in 'Person.register()' und mit der 'liste (pool.map (reg, persons))', sollte ich eine andere Funktion ausführen, die jedem Objekt das Attribut 'registred' explizit zuweist? – bninopaul

Antwort

1

Ich fand ein ähnliches Problem hier: Python multiprocessing with pathos. Der Grund, warum die Instanz der Person-Klasse nicht über das Attribut registered verfügt, besteht darin, dass der Pool im Multiprocessing Prozesse erstellt, die nur Kopien der Klasseninstanzen in der Liste sind. Um dies zu lösen, geben Sie in der Wrapper-Funktion reg() die Klasseninstanzen zurück. Das heißt,

def reg(person): 
    person.register() 
    return person 
pool = mp.Pool(processes=mp.cpu_count()//2) 
persons = list(pool.map(reg, persons)) 
+0

Ich mache das mit meiner eigenen Klasse, Methode und Wrapper-Funktion, aber ich bekomme etwas, das für diesen Code wäre wie folgt: '_pickle.PicklingError: Kann reg nicht: Attribut Lookup reg auf __main__ gescheitert', weiß jemand warum ? – someoneb100

+0

@ someb100, haben Sie sichergestellt, dass Wrapper reg() -Funktion außerhalb der Klasse ist? – bninopaul

+0

ja https://stackoverflow.com/questions/47795810/applying-a-method-in-a-list-of-class-objects-use-multiprocessing hier ist mein Problem – someoneb100

Verwandte Themen