2011-09-25 18 views
6

Insomma, dire che ho il seguente:Python classe che eredita multiprocessing, problemi con i membri della classe di accesso

import multiprocessing 

class Worker(multiprocessing.Process): 
    def __init__(self): 
     multiprocessing.Process.__init__(self) 
     print "Init" 
     self.value = None 

    def run(self): 
     print "Running" 
     self.value = 1 

p = Worker() 
p.start() 
p.join() 
print p.value 

mi aspetto l'uscita di essere:

Init 
Running 
1 

Invece è

Init 
Running 
None 

Qualcuno può spiegarmi perché questo è il caso? Cosa non riesco a capire e come dovrei farlo correttamente?

Grazie.

risposta

9

Nel momento in cui si dice p.start(), un processo separato viene biforcato fuori dal processo principale. Tutti i valori delle variabili sono copiati. Quindi il processo principale ha una copia di p e il processo biforcato ha una copia separata di p. Il Worker modifica la copia del processo biforcato di p.value, ma il processo principale è p.value e corrisponde a None.

Esistono molti modi per condividere oggetti tra processi. In questo caso, forse il modo più semplice è quello di utilizzare un mp.Value:

import multiprocessing as mp 

class Worker(mp.Process): 
    def __init__(self): 
     print "Init" 
     mp.Process.__init__(self) 
     self.num = mp.Value('d', 0.0) 

    def run(self): 
     print "Running" 
     self.num.value = 1 

p = Worker() 
p.start() 
p.join() 
print p.num.value 

Si noti che il mp.Value ha un valore predefinito di 0.0. Non può essere impostato su None.

+0

Grazie. Sembra anche che la creazione del valore numerico all'interno del costruttore (invece di costruirlo in main e passarlo) funzioni bene. Lascerò la risposta non accettata per un po '(come ho sentito è consuetudine in SO). – swalog

+0

@EXIT_FAILURE: Sì, grazie. È un po 'più bello. – unutbu

Problemi correlati