登录multiprocessing.Process的输出(Log output of multipr

2019-07-20 08:56发布

是否有使用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=0tail -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