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

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

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Подпроцесс заменяет 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 для общей памяти между процессами.

многопроцессорность абстрагирует оба 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()

Другие советы

Посмотрите на модуль многопроцессорной обработки , новый в python 2.6 (также доступен для более ранних версий - пиропроцессинг

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

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

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

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

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

Если вы выполняете разветвление операционной системы низкого уровня и действительно хотите избежать использования каналов, можно также использовать файлы с отображением общей памяти. Это не так хорошо, как использовать каналы 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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top