Mi sono chiesto spesso perché la pagina doc di Python su multiprocessing mostra solo l'approccio "funzionale" (utilizzando il parametro target
). Probabilmente perché i frammenti di codice concisi e succinti sono i migliori per scopi illustrativi. Per le piccole attività che si inseriscono in una funzione, posso vedere come questo è il modo preferito, ala:
from multiprocessing import Process
def f():
print('hello')
p = Process(target=f)
p.start()
p.join()
Ma quando hai bisogno di una maggiore organizzazione del codice (per compiti complessi), rendendo la propria classe è la strada da percorrere :
from multiprocessing import Process
class P(Process):
def __init__(self):
super(P, self).__init__()
def run(self):
print('hello')
p = P()
p.start()
p.join()
Tenere presente che ogni processo generato viene inizializzato con una copia del footprint di memoria del processo master. E che il codice costruttore (vale a dire all'interno di __init__()
) viene eseguito nel processo principale - solo il codice all'interno di run()
viene eseguito in processi separati.
Pertanto, se un processo (principale o generato) modifica la sua variabile membro, la modifica non si rifletterà in altri processi. Questo, ovviamente, è vero solo per i tipi "bulit-in", come bool
, string
, list
, ecc. È comunque possibile importare strutture di dati "speciali" dal modulo multiprocessing
che vengono quindi condivise in modo trasparente tra processi (vedere Sharing state between processes). puoi creare i tuoi canali IPC (comunicazione tra processi) come multiprocessing.Pipe
e multiprocessing.Queue
.
fonte
2013-06-20 18:09:17
Per la prima parte della domanda, se si desidera eseguire una funzione quando si crea un'istanza di un oggetto, è possibile effettuare una chiamata nella funzione '__init__' delle classi. Potresti anche tu [decoratore di proprietà] (http://docs.python.org/2/library/functions.html#property). Non sono sicuro di cosa stai chiedendo nella seconda parte. Potresti chiarire? –
Molto spesso invocherete i metodi di classe tramite un riferimento all'oggetto, come 'x.doSomthing()'. Puoi anche usare internamente i metodi non appena l'istanza dell'oggetto viene istanziata facendoli chiamare dal metodo di classe '__init__'. Se si desidera che i metodi di un oggetto "vengano eseguiti come un processo", esistono diversi modi per farlo. Il mio preferito è sottoclasse da 'Process'. Spiego un modo per farlo qui: http://stackoverflow.com/questions/15790816/python-multiprocessing-apply-class-method-to-a-list-of-objects/16202411#16202411 – DMH