使用python multiprocessing模块创建的子进程无法打印
我在下面的代码上遇到了问题,还有任何使用 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
时,才会看到输出。