2017-08-22 3 views
-1

Ich bin derzeit versucht, eine Klasse zu implementieren intensive Kalkül zu tun:Python-Prozess merge Ergebnisse

import random 
import multiprocessing as mp 


class IntensiveStuff: 

    def __init__(self): 
     self.N = 20 
     self.nb_process = 4 
     set_of_things = set() 

    def lunch_multiprocessing(self): 
     processes = [] 
     for i in range(self.nb_process): 
      processes.append(mp.Process(target=self.process_method, args=())) 
     [x.start() for x in processes] 
     [x.join() for x in processes] 
     set_of_things = ... # I want all the sub_set of 'process_method' updated in set_of_things 

    def process_method(self): 
     sub_set = set() 
     for _ in range(self.N): 
      sub_set.add(random.randint(100)) 

ich unabhängig Kalkül berechnen wollen, setzen Sie die Ergebnisse in einem sub_set für jeden Prozess und verschmelzen alle sub_set in der set_of_things (das Objekt im echten Code).

Ich habe versucht, Warteschlange ohne Erfolg zu verwenden, irgendwelche Ratschläge?

P.S: habe versucht, den Code in Can a set() be shared between Python processes? aber auch ohne Glück zu reproduzieren.

Antwort

-1

Prozesse können Speicher nicht teilen, aber sie können über Pipes, Sockets usw. kommunizieren. Multiprocessing-Modul hat spezielle Objekte (ich glaube, sie verwenden Rohre unter der Haube). multiprocessing.Queue sollte auch funktionieren, aber ich benutze oft diese beiden Objekte.

multiprocessing.Manager() Liste() und multiprocessing.Manager() dict()

results = multiprocessing.Manager().list() 
# now a bit of your code 
processes = [] 
for i in range(self.nb_process): 
    processes.append(mp.Process(target=self.process_method, args=(), results)) 

def process_method(self, results): 
    sub_set = set() 
    for _ in range(self.N): 
     sub_set.add(random.randint(100)) 
    results.append(sub_set) # or what you really need to add to results 
+0

Shared Memory in Python mit. Multiprocessing ist perfekt [möglich] (https://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes). –

+1

Die Ergebnisse = multiprocessing.Manager(). List() hat getan, was ich will, danke! – Grundoc

+0

@Michael Fouarakis, ja, aber es ist nicht "echte" geteilte Erinnerung. Ich habe es von der Prozessdefinition beschrieben. – Sergius