Comment partager des données entre un processus parent et un processus enfant créé en Python?

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

  •  03-07-2019
  •  | 
  •  

Question

Je suis à peu près sûr de pouvoir le faire en utilisant la fonction os.plock (op), mais je ne sais pas comment. De plus, s'il y a un meilleur moyen, je serais reconnaissant de le savoir. Les extraits de code sont les bienvenus.

Était-ce utile?

La solution

le sous-processus remplace os.popen, os.system, os.spawn, popen2 et les commandes. Un exemple simple de canalisation serait:

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

Vous pouvez également utiliser un fichier mappé en mémoire avec l'indicateur = MAP_SHARED pour la mémoire partagée. entre les processus.

le multitraitement résume les deux tubes et mémoire partagée et fournit une interface de niveau supérieur. Extrait de la documentation de traitement:

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

Autres conseils

Consultez le module multitraitement dans python 2.6 (également disponible en anglais). pour les versions antérieures, un pyprocessing

Voici un exemple tiré de la documentation illustrant la transmission d'informations à l'aide d'un canal, par exemple:

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

Ceci est à peu près indépendant de Python! C'est un exemple classique de la communication interprocessus Unix. Une bonne option consiste à utiliser popen () pour ouvrir un canal entre les processus parent et enfant et pour faire passer des données / messages le long du canal.

Jetez un coup d'œil au sous-processus module , qui permet de configurer automatiquement les canaux nécessaires lors de la génération de processus enfants.

Vous avez deux options: os.popen * dans le module os ou vous pouvez utiliser le module sous-processus dans le même sens. Le manuel Python contient de jolis documents et exemples pour popen et sous-processus .

Si vous procédez à une tentative de système d'exploitation de bas niveau et souhaitez vraiment éviter l'utilisation de canaux, vous pouvez également utiliser des fichiers mappés en mémoire partagée. Ce n’est pas aussi agréable que d’utiliser des tubes sous-processus ou popen , mais avec la réponse à la question de l’exhaustivité ...

Il existe un exemple complet. ici , mais vous pouvez combiner le traitement de fichiers os et modules mmap :

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top