¿Cómo comparte datos entre un proceso primario y secundario bifurcado en Python?

StackOverflow https://stackoverflow.com/questions/218935

  •  03-07-2019
  •  | 
  •  

Pregunta

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 descubrirlo. Los fragmentos de código son muy bienvenidos.

¿Fue útil?

Solución

Subproceso reemplaza os.popen, os.system, os.spawn, popen2 y los comandos. Un ejemplo simple para tuberías 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 la bandera = MAP_SHARED para memoria compartida entre procesos.

multiprocesamiento resume ambos tuberías y 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()

Otros consejos

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 el paso de información usando una tubería, 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()

¡Esto es bastante independiente de Python! Es un ejemplo clásico de comunicación entre procesos Unix. Una buena opción es usar popen () para abrir una tubería entre los procesos padre e hijo, y pasar datos / mensajes de un lado a otro a lo largo de la tubería.

Eche un vistazo al subproceso module , que puede configurar las tuberías necesarias automáticamente mientras genera procesos secundarios.

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

Si está haciendo una bifurcación del sistema operativo de bajo nivel y realmente quiere evitar el uso de tuberías, también es posible usar archivos asignados de memoria compartida. Esto no es tan bueno como usar tuberías subprocess o popen , pero incluye la respuesta para completar ...

Hay un ejemplo completo aquí , pero básicamente puede combinar el os manejo de archivos y mmap módulos:

import mmap, os, tempfile
fd, tmpfile = tempfile.mkstemp()
os.write(fd, '\x00' * mmap.PAGESIZE)
os.lseek(fd, 0, os.SEEK_SET)
child_pid = os.fork()
if child_pid:
    buf = mmap.mmap(fd, mmap.PAGESIZE, mmap.MAP_SHARED, mmap.PROT_READ)
    os.waitpid(child_pid, 0)
    child_message = buf.readline()
    print(child_message)
    os.close(fd)
else:
    buf = mmap.mmap(fd, mmap.PAGESIZE, mmap.MAP_SHARED, mmap.PROT_WRITE)
    buf.write('testing\n')
    os.close(fd)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top