thread parallel async python fork share

parallel - ¿Cómo se comparten los datos entre un padre y el proceso secundario bifurcado en Python?



shared memory python (4)

Tiene dos opciones: os.popen* en el módulo os , o puede usar el módulo de subprocess para el mismo efecto. El manual de Python tiene documentación y ejemplos bonitos para popen y subprocess .

Estoy bastante seguro de que uno haría esto usando la función os.plock (op), pero no tengo idea de cómo. Además, si hay una mejor manera, estaría agradecido de averiguarlo. Los fragmentos de código son muy bienvenidos.


¡Esto es más o menos independiente de Python! Es un ejemplo clásico de comunicación interproceso de Unix. Una buena opción es usar popen() para abrir un conducto entre los procesos padre e hijo, y pasar datos / mensajes de ida y vuelta a lo largo del conducto.

Eche un vistazo al módulo de subprocess , que puede configurar las canalizaciones necesarias automáticamente al generar procesos secundarios.


Eche un vistazo al módulo de multiprocesamiento nuevo en Python 2.6 (también disponible para versiones anteriores un pyprocessing

Aquí hay un ejemplo de los documentos que ilustran la información que pasa usando un conducto, por ejemplo:

from multiprocessing import Process, Pipe def f(conn): conn.send([42, None, ''hello'']) conn.close() if __name__ == ''__main__'': parent_conn, child_conn = Pipe() p = Process(target=f, args=(child_conn,)) p.start() print parent_conn.recv() # prints "[42, None, ''hello'']" p.join()


El subproceso reemplaza os.popen, os.system, os.spawn, popen2 y comandos. Un ejemplo simple para la tubería sería:

p1 = Popen(["dmesg"], stdout=PIPE) p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) output = p2.communicate()[0]

También puede usar un archivo mapeado de memoria con el marcador = MAP_SHARED para memoria compartida entre procesos.

multiprocesamiento abstrae las canalizaciones y la memoria compartida y proporciona una interfaz de nivel superior. Tomado de la documentación de procesamiento:

from multiprocessing import Process, Pipe def f(conn): conn.send([42, None, ''hello'']) conn.close() if __name__ == ''__main__'': parent_conn, child_conn = Pipe() p = Process(target=f, args=(child_conn,)) p.start() print parent_conn.recv() # prints "[42, None, ''hello'']" p.join()