2013-06-18 10 views
12

Questa è una domanda newbie:Utilizzando classe multiprocessing.Process di Python

una classe è un oggetto, in modo da posso creare una classe chiamata pippo() e all'interno di questo componente aggiuntivo di funzione e parametro, non capisco se le funzioni all'interno di pippo vengono eseguiti dall'alto verso il basso quando assegno x=pippo() o devo chiamarli come x.dosomething() al di fuori di pippo.

Lavorare con il pacchetto di Python multiprocessing, è meglio definire una grande funzionalità e creare l'oggetto utilizzando l'argomento target nella chiamata a Process(), o creare la propria classe processo ereditando dalla Process classe?

+0

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? –

+0

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

risposta

23

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.

+2

Il multiprocessing non richiede 'if __name__ ==" __main __ "' se stai usando Windows? Solo un'altra sorpresa da notare –

+0

Se il processo generato modificava alcuni dei tipi di dati nella sua classe, tali modifiche sarebbero visibili dal processo principale? – Woody1193

+0

@ Woody1193, non per i tipi di dati incorporati. Ma se usi i tipi di dati condivisi speciali dal modulo 'multiprocessing', otterrai l'effetto desiderato. (Ho aggiunto questa spiegazione alla mia risposta sopra.) –

Problemi correlati