使用python multiprocessing模块创建的子进程无法打印

46 投票
4 回答
62823 浏览
提问于 2025-04-15 22:23

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

这是代码(来自官方的 Python 文档):

from multiprocessing import Process

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

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

输出是空白的。

注意:以下代码使用了 threading 模块,并且可以打印输出:

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 个回答

5

我自己也遇到过这个问题,有时候是因为子进程在到达打印语句之前就悄悄出错了。如果真是这样,把子进程的代码放在一个try-except块里,然后把出现的错误信息返回(在父进程中打印出来)是一个很有效的调试方法。

9

关于多进程的文档清楚地解释了为什么这样做是行不通的!

“注意:这个包里的功能要求__main__方法必须可以被子进程导入。这在编程指南中有提到,但在这里特别指出一下是很重要的。这意味着一些示例,比如multiprocessing.Pool的示例,在交互式解释器中是无法运行的。”

48

试试这个:

from multiprocessing import Process
import sys

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

...

据我所知,使用 multiprocessing 模块创建的进程的标准输出是有缓冲的,也就是说,只有当缓冲区满了,或者你手动刷新 sys.stdout 时,才会看到输出。

撰写回答