Estado compartido en procesos de multiprocesamiento.

Por favor considere este código:

import time from multiprocessing import Process class Host(object): def __init__(self): self.id = None def callback(self): print "self.id = %s" % self.id def bind(self, event_source): event_source.callback = self.callback class Event(object): def __init__(self): self.callback = None def trigger(self): self.callback() h = Host() h.id = "A" e = Event() h.bind(e) e.trigger() def delayed_trigger(f, delay): time.sleep(delay) f() p = Process(target = delayed_trigger, args = (e.trigger, 3,)) p.start() h.id = "B" e.trigger() 

Esto da en salida.

 self.id = A self.id = B self.id = A 

Sin embargo, esperaba que diera

 self.id = A self.id = B self.id = B 

..porque el h.id ya se cambió a “B” en el momento en que se llamó al método de activación.

Parece que se crea una copia de la instancia del host en el momento en que se inicia el Proceso por separado, por lo que los cambios en el host original no influyen en esa copia.

En mi proyecto (más detallado, por supuesto), los campos de la instancia del host se modifican de vez en cuando, y es importante que los eventos que se activan por el código que se ejecuta en un proceso separado, tengan acceso a esos cambios.

multiprocesamiento ejecuta cosas en procesos separados. Es casi inconcebible que las cosas no se copien a medida que se envían, ya que compartir cosas entre procesos requiere memoria o comunicación compartidas.

De hecho, si examina detenidamente el módulo, puede ver la cantidad de esfuerzo necesario para compartir realmente algo entre los procesos después del desvío, ya sea a través de la comunicación explícita o a través de objetos compartidos explícitamente (que son de un subconjunto muy limitado de idioma, y ​​tiene que ser gestionado por un Manager ).