C'è un modo semplice per utilizzare Multiprocessing per fare l'equivalente di questo?Elaborazione multipla Python - applica un metodo di classe a un elenco di oggetti
for sim in sim_list:
sim.run()
dove gli elementi della sim_list sono oggetti "simulazione" e run() è un metodo della classe di simulazione che fa modificare gli attributi degli oggetti. Es .:
class simulation:
__init__(self):
self.state['done']=False
self.cmd="program"
def run(self):
subprocess.call(self.cmd)
self.state['done']=True
Tutte le sim in sim_list sono indipendenti, quindi la strategia non deve essere thread-safe.
Ho provato quanto segue, che è ovviamente difettoso perché l'argomento è passato da deepcopy e non è modificato sul posto.
from multiprocessing import Process
for sim in sim_list:
b = Process(target=simulation.run, args=[sim])
b.start()
b.join()
Non si desidera unire() ai processi nel ciclo o li si eseguirà uno dopo l'altro anziché in parallelo. Per rispondere alla tua domanda, potresti inviare un multiprocessing.Queue object quando avvii il processo e poi mettiti in coda quando hai finito. –
Ok per un commento su join(). Per quanto riguarda l'uso di Queue, non sono sicuro di come dovrebbe funzionare. Il mio oggetto sim non sarà comunque passato attraverso la deepcopy? – calys
@calys Su windows si otterrà un 'PicklingError' perché si sta tentando di decollare un metodo, su UNIX non c'è" deepcopy ", semplicemente ogni processo ottiene una copia perfetta dell'intero spazio di indirizzamento. È necessario sostituire il cambiamento di stato nell'istanza con una comunicazione di interprocessa esplicita. – Bakuriu