Python多进程无法启动求助:官方示例代码无输出
嘿,我之前在Jupyter Notebook里折腾multiprocessing的时候也碰到过一模一样的问题!明明代码是官方文档里的示例,就是看不到输出,当时差点以为自己哪里写错了😂
问题出在Jupyter的运行环境和普通Python脚本不一样:子进程的标准输出(stdout)默认不会和Notebook的输出区域关联起来,就算你调用了print,输出要么被缓冲住,要么直接没被Notebook捕获到。另外,虽然你已经加了if __name__ == '__main__':的判断(这在Windows系统上是必须的,避免进程递归创建),但输出的显示还是得特殊处理。
给你几个亲测有效的解决方案:
方案一:强制刷新输出缓冲区
在print函数里加上flush=True参数,强制把输出推送到stdout,这样Notebook就能捕获到内容了:
from multiprocessing import Process def f(name): print('hello', name, flush=True) # 加上flush=True if __name__ == '__main__': p = Process(target=f, args=('bob',)) p.start() p.join()
方案二:使用日志模块输出
日志模块能更好地处理跨进程的输出,而且Notebook会捕获stderr的内容,所以可以试试这种方式:
from multiprocessing import Process, log_to_stderr import logging # 把日志定向到stderr,让Notebook能显示 log_to_stderr(logging.INFO) def f(name): logging.info(f'hello {name}') if __name__ == '__main__': p = Process(target=f, args=('bob',)) p.start() p.join()
方案三:写入文件后读取输出
如果上面两种都没效果,可以把输出写到临时文件里,等子进程结束后再读取并显示:
from multiprocessing import Process import tempfile import os def f(name, output_path): with open(output_path, 'w') as fp: fp.write(f'hello {name}') if __name__ == '__main__': # 创建临时文件 tmp_file = tempfile.NamedTemporaryFile(delete=False) tmp_path = tmp_file.name tmp_file.close() p = Process(target=f, args=('bob', tmp_path)) p.start() p.join() # 读取并显示内容 with open(tmp_path, 'r') as fp: print(fp.read()) # 删除临时文件 os.unlink(tmp_path)
你可以先试试方案一,最直接简单,大部分情况下都能解决问题。如果还是不行,再试试后面的方案~
内容的提问来源于stack exchange,提问作者angryweasel
相关产品推荐
相关产品推荐

