tengo una preocupación por multiprocessing.Manager() en Python, aquí está el ejemplo,¿Cómo funciona multiprocesamiento.Manager() en python?
import multiprocessing
def f(ns):
ns.x *=10
ns.y *= 10
if __name__ == '__main__':
manager = multiprocessing.Manager()
ns = manager.Namespace()
ns.x = 1
ns.y = 2
print 'before', ns
p = multiprocessing.Process(target=f, args=(ns,))
p.start()
p.join()
print 'after', ns
y la salida es,
before Namespace(x=1, y=2)
after Namespace(x=10, y=20)
Hasta ahora, ha funcionado como se esperaba de mi, entonces yo modificado el código como este,
import multiprocessing
def f(ns):
ns.x.append(10)
ns.y.append(10)
if __name__ == '__main__':
manager = multiprocessing.Manager()
ns = manager.Namespace()
ns.x = []
ns.y = []
print 'before', ns
p = multiprocessing.Process(target=f, args=(ns,))
p.start()
p.join()
print 'after', ns
ahora, la salida es,
before Namespace(x=[], y=[])
after Namespace(x=[], y=[])
Me confundió por qué la lista no se modificó como esperaba? ¿alguien puede ayudarme a descubrir qué pasó? ¡Gracias por adelantado!
Comenzando con 3.6, los cambios en los objetos anidados se propagan automáticamente. – max
He encontrado algunos problemas al usar diccionarios anidados dentro de un NameSpace con Manager en Python 3.6.4. Asegúrese de que sus objetos anidados se estén actualizando correctamente antes de seguir adelante suponiendo que lo estén. La solución para mí fue definir explícitamente cada objeto que se compartirá como un objeto Manager. – Joules