2017-10-05 2 views
0

die folgende Situation vor:die Elemente identifizieren durch verschiedene Prozesse zurück

class A: 
    def __init__(self): 
     self.b_list = [] 

    def add_element(b) 
     self.b_list.append(b) 

class B: 
    def __init__(self,x): 
     self.x = x 

class C: 
    def __init__(self,a,other_data): 
     self.a = a 
    def find_new_b(self): 
     .... 


def solve(c): 
    return c.find_new_b() 

Jede Instanz class A hat eine Liste von Instanzen von class B, die in einer inkrementellen Weise hinzugefügt werden.

Ich muss über alle Instanzen von class A iterieren und für jedes von ihnen ein neues Element von class B finden.

ich multiprocessing bin mit, dass

list_of_c_elements = [...] 
pool = multiprocessing.Pool() 
results = pool.map(solve, list_of_c_elements) 

Das Problem

In Ergebnissen zu tun, habe ich eine Liste von Ergebnissen, und ich möchte davon Instanz class A die neue Instanz verstehen class B gehört. Jede Instanz von class B ist generisch, und ich möchte die beiden Klassen entkoppelt halten.

Considered Lösung

ändern solve() zu:

def solve(c): 
    return (c.a, c.find_new_b()) 

Ich habe alle Elemente von class A vergleichen Ich habe mit der eine (sehr ineffizient) zurückgegeben.

for output in results: 
    output[0].add_element(output[1]) 

da die Instanz von class A zurückgekehrt ist ein weiteres Beispiel: Ich kann so etwas wie nicht tun.

Gibt es einen effizienteren Weg, um mein Ziel zu erreichen?

+0

Für die zweite überlegte Lösung, was meinst du, du kannst es nicht verwenden "da das Objekt vom Typ A zurückgegeben ist ein anderes Objekt"? – martineau

+0

In einer Iteration könnte ich mehr als einmal die Lösung mit dem gleichen Objekt vom Typ A aufrufen und mehr als 2 Ergebnisse für das gleiche Objekt erhalten. Mit der zurückgegebenen Ausgabe [0] und der Ausgabe [0] .add_b_element (Ausgabe [1]) für jedes Element in den Ergebnissen würden also zwei verschiedene Objekte vom Typ A hinzugefügt. – newbie

+0

Also sagen Sie, dass die 'list_of_c_elements' kann haben Sie doppelte 'C'-Instanzen drin? Scheint so zu sein - das Hinzufügen eines b-Elements zweimal zu vermeiden - wäre ein Problem, egal was du tust. Hinweis Klasse 'A' hat keine Methode mit dem Namen' add_b_element() '. – martineau

Antwort

1

C könnte zusätzlich id(a) in einem Mitglied halten und Sie können ein Indexwörterbuch {id(a): a} bei Bedarf generieren. Beachten Sie, dass alle Aufrufe von natürlich im Hauptprozess passieren müssen, um brauchbare Ergebnisse zu erzeugen.

Verwandte Themen