访问python中子进程的标准输出

KT1*_*100 3 python multiprocessing

如何在将子进程发送到主进程之前访问它们的stdout?我正在使用multiprocessing.Pool模块来生成子进程池.

kou*_*ouk 9

主进程和子进程共享相同的标准输入和标准输出文件描述符.他们无法控制对方写给他们的内容.你能做的唯一的事情就是更换stdinstdout与其他主进程可以控制的东西孩子们.作为示例,您可以子类化一个虚拟文件对象,StringIO并通过以下方式将子项写入此对象的数据重定向到父对象Queue:

import sys
from multiprocessing import Queue, Pool, current_process
from StringIO import StringIO

class MyStringIO(StringIO):
    def __init__(self, queue, *args, **kwargs):
        StringIO.__init__(self, *args, **kwargs)
        self.queue = queue
    def flush(self):
        self.queue.put((current_process().name, self.getvalue()))
        self.truncate(0)

def initializer(queue):
     sys.stderr = sys.stdout = MyStringIO(queue)

def task(num):
     print num
     sys.stdout.flush()
     return num ** 2

q = Queue()
pool = Pool(3, initializer, [q])

for _ in pool.map(task, range(5)):
    proc, out = q.get()
    print proc, "got", out
Run Code Online (Sandbox Code Playgroud)

这应该是这样的:

PoolWorker-1 got 0
PoolWorker-1 got 3
PoolWorker-1 got 4
PoolWorker-2 got 1
PoolWorker-3 got 2
Run Code Online (Sandbox Code Playgroud)

不要忘记sys.{stdout,stderr}.flush()在最后调用,task否则什么都不会写入队列.