是否有使用Python中的multiprocessing.Process类时从给定的进程日志标准输出输出方式?
Answer 1:
最简单的方法可能是只覆盖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
Answer 2:
只有两件事情我想补充到@马克Rushakoff答案。 调试时,我发现它真的有用改变buffering
我的参数open()
调用0。
sys.stdout = open(str(os.getpid()) + ".out", "a", buffering=0)
否则, 疯狂的,因为当tail -f
荷兰国际集团输出文件中的结果可以verrry间歇性的。 buffering=0
为tail -f
安排提供极高。
而对于完整性,请你帮个忙,并重定向sys.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'
下面有相应的要点
Answer 3:
您可以设置sys.stdout = Logger()
其中Logger
是一个类,它的write
方法(直接或累积,直到\n
检测)调用logging.info
(或要登录任何其他方式)。 在这一行动的一个例子。
我不知道你所说的“给定”的过程是什么意思(谁给了它,什么与所有其它的区别吗......?),但如果你的意思是你知道你要挑出这样在什么时间过程中,你实例,那么你可以包装它的target
函数(只) -或run
你在一个压倒一切的方法Process
子-成一个执行此sys.stdout的“重定向”的包装-而独自离开其他进程。
也许如果你明确的规格一点我可以更详细地帮助......?
文章来源: Log output of multiprocessing.Process