Come si condividono i dati tra un processo genitore e figlio biforcuto in Python?

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

  •  03-07-2019
  •  | 
  •  

Domanda

Sono abbastanza sicuro che uno lo farebbe usando la funzione os.plock (op), ma non ho idea di come. Inoltre, se c'è un modo migliore, sarei grato di scoprirlo. Gli snippet di codice sono i benvenuti.

È stato utile?

Soluzione

Subprocess sostituisce os.popen, os.system, os.spawn, popen2 e comandi. Un un semplice esempio di piping sarebbe:

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

Puoi anche utilizzare un file mappato in memoria con il flag = MAP_SHARED per la memoria condivisa tra processi.

multiprocessing estrae entrambi pipe e memoria condivisa e fornisce un'interfaccia di livello superiore. Tratto dalla documentazione di elaborazione:

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()

Altri suggerimenti

Dai un'occhiata al multiprocessing nuovo in Python 2.6 (disponibile anche per le versioni precedenti un pyprocessing

Ecco un esempio dai documenti che illustrano il passaggio di informazioni usando una pipe 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()

Questo è praticamente indipendente da Python! È un classico esempio di comunicazione tra processi Unix. Una buona opzione è quella di utilizzare popen () per aprire una pipe tra i processi padre e figlio e passare dati / messaggi avanti e indietro lungo la pipe.

Dai un'occhiata al sottoprocesso module , che può impostare automaticamente le pipe necessarie durante la generazione di processi figlio.

Hai due opzioni: os.popen * nel modulo os , oppure puoi usare il modulo subprocess con lo stesso effetto. Il manuale di Python contiene una bella documentazione ed esempi per popen e sottoprocesso .

Se si sta eseguendo il fork di sistemi operativi di basso livello e si vuole davvero evitare l'utilizzo di pipe, è possibile utilizzare anche i file associati alla memoria condivisa. Questo non è bello come usare le pipe subprocess o popen , ma includere la risposta per completezza ...

C'è un esempio completo qui , ma fondamentalmente puoi combinare la os gestione dei file e mmap moduli:

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top