Sono quasi sicuro che lo farei usando la funzione os.plock (op), ma non ho idea di come. Inoltre, se c'è un modo migliore, sarei grato di scoprirlo. I frammenti di codice sono benvenuti.Come si condividono i dati tra un processo genitore e un processo figlio biforcuto in Python?
risposta
Subprocess sostituisce os.popen, os.system, os.spawn, popen2 e comandi. Un simple example for piping sarebbe:
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]
Si potrebbe anche usare un memory mapped file con la bandiera = MAP_SHARED per la memoria condivisa tra i processi.
multiprocessing riassunti sia pipes e shared memory e fornisce un'interfaccia di livello superiore. Preso dalla documentazione Processing:
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()
Questo è praticamente indipendente da Python! È un classico esempio di comunicazione di interpreti Unix. Una buona opzione è usare popen()
per aprire una pipe tra i processi padre e figlio e passare i dati/messaggi avanti e indietro lungo la pipe.
Dai uno sguardo allo subprocess
module, che può impostare automaticamente le pipe necessarie durante lo spawn dei processi figli.
Sono disponibili due opzioni: os.popen*
nel modulo os
oppure è possibile utilizzare il modulo subprocess
allo stesso effetto. Il manuale di Python ha una buona documentazione ed esempi per popen e subprocess.
Date un'occhiata al multiprocessing nuovo modulo in Python 2.6 (disponibile anche per le versioni precedenti di un pyprocessing
Ecco un esempio dalla documentazione che illustrano le informazioni che passano con un tubo per esempio :
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()
Si potrebbe parlare del valore, array e le classi Gestore forniti da multiprocessing, che permettono la condivisione dei dati: http://docs.python.org/library/multiprocessing.html#sharing-state-between-processes – tzot