Python: anexando a la misma lista de diferentes procesos usando multiprocesamiento

Necesito agregar objetos a una lista “L” de diferentes procesos usando multiprocesamiento, pero devuelve una lista vacía. ¿Cómo puedo dejar que muchos procesos se agreguen a la lista “L” mediante multiprocesamiento?

#!/usr/bin/python from multiprocessing import Process L=[] def dothing(i,j): L.append("anything") print i if __name__ == "__main__": processes=[] for i in range(5): p=Process(target=dothing,args=(i,None)) p.start() processes.append(p) for p in processes: p.join() print L 

Las variables globales no se comparten entre procesos.

Necesitas usar multiprocessing.Manager.list :

 from multiprocessing import Process, Manager def dothing(L, i): # the managed list `L` passed explicitly. L.append("anything") if __name__ == "__main__": with Manager() as manager: L = manager.list() # <-- can be shared between processes. processes = [] for i in range(5): p = Process(target=dothing, args=(L,i)) # Passing the list p.start() processes.append(p) for p in processes: p.join() print L 

Ver compartir el estado entre procesos¶ (parte del proceso del servidor ).

Utilizando la solución provista por @falsetru funcionó. pero aún no se pudo acceder a la lista más allá de ” with Manager() as manager: ” se necesitaron dos cambios: 1.) agregar ” L = [] ” delante de la statement ” if __name__ == "__main__ “:”

Debe agregarse por alguna razón la última print(L) (la “Fuera de IF”) intenta ejecutarse tantas veces como haya Procesos + 1?!?!?

esto devuelve un error que L no está definido y el código se rompe.

2.) agregando ” L = list(L) ” después de la p.join()p.join() “.

paso necesario para cambiar Manager.list a Python.list regular; de lo contrario, las llamadas a manager.list devuelven errores que no se pueden leer.

 #################### ####### CODE: ###### #################### from multiprocessing import Process, Manager def dothing(L, i): # the managed list `L` passed explicitly. for j in range(5): text = "Process " + str(i) + ", Element " + str(j) L.append(text) L = [] if __name__ == "__main__": with Manager() as manager: L = manager.list() # <-- can be shared between processes. processes = [] for i in range(5): p = Process(target=dothing, args=(L,i,)) # Passing the list p.start() processes.append(p) for p in processes: p.join() L = list(L) print("Within WITH") print(L) print("Within IF") print(L) print("Outside of IF") print(L) 

""
########################### OUTPUT: ##### ################# ###

 Outside of IF [] Outside of IF [] Outside of IF [] Outside of IF [] Outside of IF [] Outside of IF [] Within WITH ['Process 2, Element 0', 'Process 2, Element 1', 'Process 2, Element 2', 

'Proceso 2, Elemento 3', 'Proceso 2, Elemento 4', 'Proceso 1, Elemento 0', 'Proceso 1, Elemento 1', 'Proceso 1, Elemento 2', 'Proceso 1, Elemento 3', 'Proceso 1, Elemento 4 ',' Proceso 0, Elemento 0 ',' Proceso 0, Elemento 1 ',' Proceso 0, Elemento 2 ',' Proceso 0, Elemento 3 ',' Proceso 0, Elemento 4 ',' Proceso 4, Elemento 0 ',' Proceso 4, Elemento 1 ',' Proceso 4, Elemento 2 ',' Proceso 4, Elemento 3 ',' Proceso 4, Elemento 4 ',' Proceso 3, Elemento 0 ',' Proceso 3, Elemento 1 ',' Proceso 3, Elemento 2 ',' Proceso 3, Elemento 3 ',' Proceso 3, Elemento 4 ']

 Within IF ['Process 2, Element 0', 'Process 2, Element 1', 'Process 2, Element 2', 

'Proceso 2, Elemento 3', 'Proceso 2, Elemento 4', 'Proceso 1, Elemento 0', 'Proceso 1, Elemento 1', 'Proceso 1, Elemento 2', 'Proceso 1, Elemento 3', 'Proceso 1, Elemento 4 ',' Proceso 0, Elemento 0 ',' Proceso 0, Elemento 1 ',' Proceso 0, Elemento 2 ',' Proceso 0, Elemento 3 ',' Proceso 0, Elemento 4 ',' Proceso 4, Elemento 0 ',' Proceso 4, Elemento 1 ',' Proceso 4, Elemento 2 ',' Proceso 4, Elemento 3 ',' Proceso 4, Elemento 4 ',' Proceso 3, Elemento 0 ',' Proceso 3, Elemento 1 ',' Proceso 3, Elemento 2 ',' Proceso 3, Elemento 3 ',' Proceso 3, Elemento 4 ']

 Outside of IF ['Process 2, Element 0', 'Process 2, Element 1', 'Process 2, Element 2', 

'Proceso 2, Elemento 3', 'Proceso 2, Elemento 4', 'Proceso 1, Elemento 0', 'Proceso 1, Elemento 1', 'Proceso 1, Elemento 2', 'Proceso 1, Elemento 3', 'Proceso 1, Elemento 4 ',' Proceso 0, Elemento 0 ',' Proceso 0, Elemento 1 ',' Proceso 0, Elemento 2 ',' Proceso 0, Elemento 3 ',' Proceso 0, Elemento 4 ',' Proceso 4, Elemento 0 ',' Proceso 4, Elemento 1 ',' Proceso 4, Elemento 2 ',' Proceso 4, Elemento 3 ',' Proceso 4, Elemento 4 ',' Proceso 3, Elemento 0 ',' Proceso 3, Elemento 1 ',' Proceso 3, Elemento 2 ',' Proceso 3, Elemento 3 ',' Proceso 3, Elemento 4 ']

 """ 

Gracias a @falsetru por sugerir la documentación exacta y proporcionar el buen código. Necesito mantener el orden para mi aplicación y al modificar el código de @falsetru, ahora el siguiente código conserva el orden de agregar elementos a la lista.

El sueño es útil para atrapar los errores, de lo contrario es difícil detectar el problema al ordenar la lista.

 from multiprocessing import Process, Manager from time import sleep def dothing(L, i): # the managed list `L` passed explicitly. L[i]= i sleep(4) if __name__ == "__main__": with Manager() as manager: L = manager.list(range(50)) # <-- can be shared between processes. processes = [] for i in range(50): p = Process(target=dothing, args=(L,i)) # Passing the list p.start() processes.append(p) for p in processes: p.join() print(L)