日志输出的多进程。进程

在python中使用multiprocessing.Process类时,是否有办法logging给定Process的stdout输出?

最简单的方法可能是重写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
 27494.out 27494.out m.py
 $ cat 27493.out 
函数f
模块名称:__main__
父母程序:27492
进程ID:27493
你好鲍勃
 $猫27494.out 
函数f
模块名称:__main__
父母程序:27492
进程ID:27494
你好弗雷德

只有两件事我会添加到@Mark Rushakoff的答案。 debugging时,我发现将open()调用的buffering参数更改为0非常有用。

 sys.stdout = open(str(os.getpid()) + ".out", "a", buffering=0) 

否则, 疯狂 ,因为当tail -f输出文件的结果可以verrry间歇。 buffering=0tail -f伟大。

为了完整sys.stderr ,请自己sys.stderr ,并redirectsys.stderr

 sys.stderr = open(str(os.getpid()) + "_error.out", "a", buffering=0) 

另外,为了方便起见,如果你愿意,可以把它转储到一个单独的进程类中,

 class MyProc(Process): def run(self): # Define the logging in run(), MyProc's entry function when it is .start()-ed # p = MyProc() # p.start() self.initialize_logging() print 'Now output is captured.' # Now do stuff... def initialize_logging(self): sys.stdout = open(str(os.getpid()) + ".out", "a", buffering=0) sys.stderr = open(str(os.getpid()) + "_error.out", "a", buffering=0) print 'stdout initialized' 

inheritance人相应的要点

您可以设置sys.stdout = Logger() ,其中Logger是一个类,其write方法(立即,或积累,直到检测到\n )调用logging.info (或任何其他方式要logging)。 这是一个例子。

我不确定你所说的“给定的过程(谁给了它,它与其他所有的过程有什么区别)”是什么意思,但是如果你的意思是你知道你想在那个时候select什么过程实例化它,然后你可以把它的target函数(或者只是)或者你在一个Process子类中重写的run方法包装到一个执行这个sys.stdout“redirect”的包装器中, 。

也许如果你指出了一些规格,我可以帮助更详细…?