Как вы делитесь данными между родительским и разветвленным дочерним процессом в Python? - PullRequest
11 голосов
/ 20 октября 2008

Я почти уверен, что это можно сделать с помощью функции os.plock (op), но я понятия не имею, как это сделать. Кроме того, если есть лучший способ, я был бы рад узнать. Фрагменты кода очень приветствуются.

Ответы [ 5 ]

13 голосов
/ 20 октября 2008

Подпроцесс заменяет os.popen, os.system, os.spawn, popen2 и команды. Простым примером для трубопровода будет:

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

Вы также можете использовать файл отображения памяти с флагом = MAP_SHARED для совместной памяти между процессами.

многопроцессорная обработка абстрагирует обе трубы и разделяемую память и обеспечивает интерфейс более высокого уровня Взято из Технологической документации:

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()
7 голосов
/ 20 октября 2008

Взгляните на модуль multiprocessing , новый в python 2.6 (также доступен для более ранних версий pyprocessing

Вот пример из документов, иллюстрирующих передачу информации с использованием, например, канала:

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()
4 голосов
/ 20 октября 2008

Это в значительной степени независимый от Python! Это классический пример межпроцессного взаимодействия Unix. Хорошим вариантом является использование popen() для открытия канала между родительским и дочерним процессами и передачи данных / сообщений назад и вперед по каналу.

Посмотрите на модуль subprocess , который может автоматически устанавливать необходимые каналы при порождении дочерних процессов.

1 голос
/ 20 октября 2008

У вас есть два варианта: os.popen* в модуле os, или вы можете использовать модуль subprocess для того же эффекта. Руководство по Python содержит красивую документацию и примеры для подпроцесса popen и .

0 голосов
/ 14 июня 2018

Если вы выполняете разветвление операционной системы низкого уровня и действительно хотите избежать использования каналов, можно также использовать файлы с отображением общей памяти. Это не так хорошо, как использование subprocess или popen труб, но включает в себя ответ для полноты ...

Здесь приведен полный пример , но в основном вы можете объединить os обработку файлов и 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)
...