2011-09-25 20 views
6

En resumen, decir que tengo el siguiente:Python clase que hereda de multiprocesamiento, problemas con miembros de la clase con el acceso

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 

yo esperaría que la salida sea:

Init 
Running 
1 

En cambio, es

Init 
Running 
None 

¿Puede alguien explicarme por qué es este el caso? ¿Qué no estoy entendiendo y cómo debo hacerlo correctamente?

Gracias.

Respuesta

9

El momento en que dices p.start(), un proceso separado se bifurca fuera del proceso principal. Todos los valores variables se copian. Entonces el proceso principal tiene una copia de p, y el proceso bifurcado tiene una copia separada de p. El Worker modifica la copia del proceso bifurcado de p.value, pero el proceso principal es p.value y todavía es None.

Hay muchas formas de compartir objetos entre procesos. En este caso, tal vez la forma más sencilla es utilizar 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 

Tenga en cuenta que la mp.Value tiene un valor predeterminado de 0.0. No se puede establecer en None.

+0

Gracias. También parece que la creación de valor numérico dentro del constructor (en oposición a la construcción en principal y pasándolo) también funciona bien. Dejaré la respuesta inaceptable por un tiempo (como he oído es habitual en SO). – swalog

+0

@EXIT_FAILURE: Sí, gracias. Eso es un poco mejor. – unutbu

Cuestiones relacionadas