2017-10-05 4 views
0

la situation suivante:Identifier les éléments Renvoyé par différents processus

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() 

Chaque instance de class A a une liste d'instances de class B, qui sont ajoutés de façon incrémentale.

J'ai besoin d'itérer sur toutes les instances de class A et de trouver pour chacun d'eux un nouvel élément de class B.

J'utilise multiprocessing pour faire

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

Le problème

Dans les résultats que j'ai une liste de résultats et je voudrais comprendre de quelle instance de class A la nouvelle instance de class B appartient. Chaque instance de class B est générique et j'aimerais que les deux classes soient découplées.

solution envisagée

Changer solve() à:

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

Je dois comparer tous les éléments de class A je avec celui qui est retourné (très inefficace). Je ne peux pas faire quelque chose comme:

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

depuis l'instance de class A retournée est une autre instance.

Existe-t-il un moyen plus efficace d'atteindre mon objectif?

+0

Pour la deuxième solution envisagée, que voulez-vous dire par là que vous ne pouvez pas l'utiliser "puisque l'objet de type A retourné est un autre objet"? – martineau

+0

En une itération, je pourrais appeler plus d'une fois la résolution avec le même objet de type A et obtenir plus de 2 résultats pour le même objet. Ainsi, en utilisant la sortie [0] retournée et en produisant la sortie [0] .add_b_element (sortie [1]) pour chaque élément dans les résultats, on ajouterait 2 objets différents de type A. – newbie

+0

Donc vous dites que le 'list_of_c_elements' peut avez des instances C en double? On dirait que cela - éviter d'ajouter un élément b deux fois - serait un problème, peu importe ce que vous faites. Notez que la classe 'A' n'a pas de méthode nommée' add_b_element() '. – martineau

Répondre

1

C peut également contenir id(a) dans un membre et vous pouvez générer un dictionnaire d'index {id(a): a} si nécessaire. Sachez que tous les appels de id() doivent bien sûr se produire dans le processus principal pour produire des résultats utilisables.