2008-10-20 2 views
10

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

ответ

12

Subprocess заменяет os.popen, os.system, os.spawn, popen2 и команды. simple example for piping будет:

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

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

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

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

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

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

1

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

7

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

Вы могли бы отметить значение, массив и классы диспетчера, предоставляемые многопроцессорной, которые позволяют совместное использование данных: http://docs.python.org/library/multiprocessing.html#sharing-state-between-processes – tzot

Смежные вопросы