Python pasando diccionario para procesar en multiprocesamiento

Tengo una clase que contiene un número (grande) de propiedades diferentes, incluidos algunos diccionarios. Cuando paso una instancia de la clase a un nuevo proceso, todos los valores numéricos parecen pasar correctamente, pero todos los diccionarios que estaban en el objeto de clase se vacían.

Aquí hay una prueba simple que cociné que demuestra mi problema:

from multiprocessing import Process class State: a = 0 b = {} def f(s, i): print "f:", sa, sb def main(): state = State() state.a = 11 state.b['testing'] = 12 print "Main:", state.a, state.b ps = [] for i in range(1): p = Process(target=f, args=(state, i)) p.start() # Do the work ps.append(p) for p in ps: p.join() if __name__ == '__main__': main() 

Espero que la salida sea

 Main: 11 {'testing': 12} f: 11 {'testing': 12} 

pero en cambio me dan

 Main: 11 {'testing': 12} f: 11 {} 

el problema se describe claramente en la documentación para el módulo de multiprocesamiento: Windows carece de una llamada al sistema fork() , por lo que en Windows, el código fuente del módulo se reevalúa al inicio de cada proceso, por lo que no se conserva el estado actual. (En un sistema basado en * x, incluido OSX, el proceso se implementa mediante una bifurcación y el estado se conserva)

tenga en cuenta que estoy hablando del estado de todo el módulo de Python.

su forma de mantener un estado es incorrecta: los miembros b de la clase State son miembros ‘estáticos’ de toda la clase, no son parte de una instancia de un objeto State . Al hacer state.a = 11 , está modificando la clase State , no una instancia de la clase.

su código hubiera funcionado bien si a y b hubieran sido miembros de la clase State :

 class State(object): def __init__(self) self.a = 0 self.b = {} 

entonces, pasar la instancia de state a un nuevo Proceso, habría pasado correctamente el valor como se esperaba.

Terminé resolviendo este problema al pasar los diccionarios explícitamente además del estado. p.ej

p = Process(target=f, args=(state, i, state.b))