Wie teilen Sie Daten zwischen einem Elternteil und Kind gegabelten Prozess in Python?

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

  •  03-07-2019
  •  | 
  •  

Frage

Ich bin mir ziemlich sicher, dass man dies tun würde, die os.plock (op) Funktion, aber ich habe keine Ahnung, wie. Auch wenn es eine bessere Art und Weise ist, würde ich dankbar sein, um herauszufinden. Code-Schnipsel sind sehr willkommen.

War es hilfreich?

Lösung

Subprocess ersetzt os.popen, os.system, os.spawn, popen2 und Befehle. Ein rel="noreferrer"> wäre:

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

Sie können auch ein Memory-Mapped-Datei mit dem Flag = MAP_SHARED für gemeinsam genutzten Speicher verwenden zwischen Prozessen.

Multiprozessing Abstracts sowohl Rohre und Shared Memory und liefert eine höhere Schnittstelle. Genommen von der Verarbeitung Dokumentation:

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

Andere Tipps

Werfen Sie einen Blick auf die Multiprozessing 2.6 in Python neues Modul (auch erhältlich für frühere Versionen eines pyprocessing

Hier ist ein Beispiel aus der Dokumentation darstellt Weitergabe von Informationen ein Rohr zum Beispiel mit:

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

Das ist so ziemlich Python-unabhängig! Es ist ein klassisches Beispiel für Unix Interprozess-Kommunikation. Eine gute Möglichkeit ist, popen() zu verwenden, um ein Rohr zwischen den übergeordneten und untergeordneten Prozessen zu öffnen, und übergeben Sie Daten / Nachrichten hin und her entlang des Rohres.

Werfen Sie einen Blick auf die subprocess Modul , die die notwendigen Rohre automatisch einrichten können, während Child-Prozesse Laichen.

Sie haben zwei Möglichkeiten: os.popen* im os Modul, oder Sie können das subprocess Modul auf den gleichen Effekt verwendet werden. Das Python-Handbuch hat ziemlich Dokumentation und Beispiele für popen und subprocess .

Wenn Sie Low-Level-Betriebssystem Forking tun und wirklich wollen, mit Rohren zu vermeiden, ist es möglich, geteilt zu verwenden, als auch Memory-Mapped-Dateien. Dies ist nicht annähernd so schön wie mit subprocess oder popen Rohren, aber einschließlich der Antwort auf Vollständigkeit ...

Es gibt ein vollständiges Beispiel hier , aber im Grunde können Sie den os Datei-Handling und mmap Module:

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top