Как вы делитесь данными между родительским и раздвоенным дочерним процессом в Python?

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

Ответ 1

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

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

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

multiprocessing абстрагирует как pipe, так и разделяемая память и обеспечивает интерфейс более высокого уровня. Из документации по обработке:

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

Ответ 2

Взгляните на модуль 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()

Ответ 3

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

Взгляните на subprocess module, который автоматически настраивает необходимые каналы при нерестах дочерних процессов.

Ответ 4

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