Как вы делитесь данными между родительским и разветвленным дочерним процессом в Python?
Вопрос
Я почти уверен, что это можно сделать с помощью функции 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 ()
для открытия канала между родительским и дочерним процессами и передачи данных / сообщений назад и вперед по каналу.
Посмотрите на подпроцесс модуль code>
, который может автоматически устанавливать необходимые каналы при порождении дочерних процессов.
У вас есть два варианта: 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)