Utilizando el módulo multiprocesamiento.

Estoy tratando de usar el módulo de multiprocesamiento en Python 2.6, pero aparentemente hay algo que no entiendo. Espero que la siguiente clase sume los números enviados por add () y devuelva la sum en el método get_result (). El siguiente código imprime “0”, me gustaría que imprima “2”. ¿Qué me he perdido?

import multiprocessing class AdderProcess(multiprocessing.Process): def __init__(self): multiprocessing.Process.__init__(self) self.sum = 0 self.queue = multiprocessing.JoinableQueue(5) self.daemon = True self.start() def run(self): while True: number = self.queue.get() self.sum += number self.queue.task_done() def add(self, number): self.queue.put(number) def get_result(self): self.queue.join() return self.sum p = AdderProcess() p.add(1) p.add(1) print p.get_result() 

PD. Este problema ha sido resuelto. Gracias por las respuestas! Solo para facilitarlo a cualquier lector, aquí está la versión completa de trabajo:

 import multiprocessing class AdderProcess(multiprocessing.Process): def __init__(self): multiprocessing.Process.__init__(self) self.sum = multiprocessing.Value('d', 0.0) self.queue = multiprocessing.JoinableQueue(5) self.daemon = True self.start() def run(self): while True: number = self.queue.get() self.sum.value += number self.queue.task_done() def add(self, number): self.queue.put(number) def get_result(self): self.queue.join() return self.sum.value p = AdderProcess() p.add(1) p.add(1) print p.get_result() 

Cambie self.sum = 0 por self.sum = multiprocessing.Value('d', 0.0) , y use self.sum.value para acceder o cambiar el valor.

 class AdderProcess(multiprocessing.Process): def __init__(self): ... self.sum = multiprocessing.Value('d', 0.0) ... def run(self): while True: number = self.queue.get() self.sum.value += number # <-- use self.sum.value self.queue.task_done() def get_result(self): self.queue.join() return self.sum.value # <-- use self.sum.value 

El problema es el siguiente: una vez que llama a self.start() en __init__ , el proceso principal desactiva un proceso secundario. Todos los valores son copiados. Ahora hay dos versiones de p . En el proceso principal, p.sum es 0. En el proceso hijo, se llama al método de run y p.sum se aumenta a 2. Pero cuando el proceso principal llama a p.get_result() , su versión de p todavía tiene p.sum igual a 0. Entonces se imprime 0.

Cuando quiere compartir un valor flotante entre procesos, necesita usar un mecanismo de intercambio, como mp.Value .

Consulte " Compartir el estado entre procesos " para obtener más opciones sobre cómo compartir valores.

self.sum es 2 … en ese proceso:

 def run(self): while True: number = self.queue.get() print "got %s from queue" % number print "Before adding - self.sum = %d" % self.sum self.sum += number print "After adding - self.sum = %d" % self.sum self.queue.task_done() [ 13:56 jon@host ~ ]$ ./mp.py got 1 from queue Before adding - self.sum = 0 After adding - self.sum = 1 got 1 from queue Before adding - self.sum = 1 After adding - self.sum = 2 

Ver multiproceso 16.3.1.4. – Compartir el estado entre procesos sobre cómo obtener self.sum para ser el mismo en diferentes procesos.