Выход журнала многопроцессорной обработки.Процесс


есть ли способ зарегистрировать вывод stdout из данного процесса при использовании многопроцессорной обработки.Класс процесса в python?

3 54

3 ответа:

самый простой способ может быть, чтобы просто переопределить sys.stdout. Немного изменив пример из руководство по многопроцессорной обработке:

from multiprocessing import Process
import os
import sys

def info(title):
    print title
    print 'module name:', __name__
    print 'parent process:', os.getppid()
    print 'process id:', os.getpid()

def f(name):
    sys.stdout = open(str(os.getpid()) + ".out", "w")
    info('function f')
    print 'hello', name

if __name__ == '__main__':
    p = Process(target=f, args=('bob',))
    p.start()
    q = Process(target=f, args=('fred',))
    q.start()
    p.join()
    q.join()

и:

$ ls
m.py
$ python m.py
$ ls
27493.out  27494.out  m.py
$ cat 27493.out 
function f
module name: __main__
parent process: 27492
process id: 27493
hello bob
$ cat 27494.out 
function f
module name: __main__
parent process: 27492
process id: 27494
hello fred

есть только две вещи, которые я бы добавил к ответу @Mark Rushakoff. При отладке, я нашел его очень полезным, чтобы изменить

вы можете установить sys.stdout = Logger() здесь Logger - это класс, у которого write метод (немедленно, или накапливается до a \n обнаружено) звонки logging.info (или любым другим способом вы хотите войти). пример этого в действии.

Я не уверен, что вы подразумеваете под "данным" процессом (кто его дал, что отличает его от всех других...?), но если вы имеете в виду, что знаете, какой процесс вы хотите выделить таким образом в момент его создания, то вы можете обернуть его target функция (и только) -- или run метод, который вы переопределяете в Process подкласс -- в оболочку, которая выполняет эту систему.stdout "перенаправление" -- и оставьте другие процессы в покое.

может быть, если вы прибить спецификации немного я могу помочь более подробно...?