使用python多处理模块创建的子进程将无法打印

时间:2010-05-05 15:28:59

标签: python printing multiprocessing

我遇到了下面的代码问题,以及在子进程中使用print函数的任何代码。即使我使用sys.std[err|out].write('worker')代替print,我也看不到任何打印的陈述。

这是代码(from the official python documentation):

from multiprocessing import Process

def f(name):
    print 'hello', name

if __name__ == '__main__':
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()

输出为空白。

注意:以下代码使用线程模块并打印输出:

import threading

def f(name):
    print 'hello', name

if __name__ == '__main__':
    p = threading.Thread(target=f, args=('bob',))
    p.start()
    p.join()

输出hello bob

你能指点我的解决方案吗?提前谢谢。

4 个答案:

答案 0 :(得分:27)

试试这个:

from multiprocessing import Process
import sys

def f(name):
    print 'hello', name
    sys.stdout.flush()

...

AFAIK由multiprocessing模块生成的处理标准输出被缓冲,因此只有缓冲区变满或显式刷新sys.stdout时才会看到输出。

答案 1 :(得分:5)

多处理的文档清楚地解释了why这不起作用!

“注意:此程序包中的功能要求子进程可以导入__main__方法。这在编程指南中有所涉及,但值得指出这一点。这意味着一些示例,例如multiprocessing.Pool示例不会在交互式口译员工作。“

答案 2 :(得分:2)

我本人也遇到了这个问题,有时可能是因为子进程实际上在进入打印语句之前一直静默失败。在这种情况下,将子流程代码包装在try-except块中并返回异常对象(将在父流程中打印)是调试此问题的有效方法。

答案 3 :(得分:0)

我使用的是PyCharm IDE,通过选中“运行/调试配置”中的“在输出控制台中仿真终端”字段,它打印了所需的结果。

enter image description here

希望它对您使用PyCharm有所帮助。