在将子进程发送到主进程之前,如何访问它们的标准输出?我正在使用 multiprocessing.Pool 模块来生成子进程池。
问问题
7280 次
1 回答
9
主进程和子进程都共享相同的标准输入和标准输出文件描述符。他们无法控制其他人写给他们的内容。你唯一能做的就是用主进程可以控制的其他东西替换子进程stdin
。stdout
例如,您可以子类化一个虚拟文件对象,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
这应该打印如下内容:
PoolWorker-1 got 0
PoolWorker-1 got 3
PoolWorker-1 got 4
PoolWorker-2 got 1
PoolWorker-3 got 2
不要忘记sys.{stdout,stderr}.flush()
在结束时调用,task
否则不会将任何内容写入队列。
于 2013-10-17T08:14:18.613 回答