为什么在Jupyter中使用multiprocessing时print语句不输出内容?
问题原因
- 首先是Windows系统下多进程启动规则限制:Windows系统中
multiprocessing默认使用spawn模式创建子进程,该模式要求所有进程创建逻辑必须放在if __name__ == '__main__'的保护块中。你当前的代码没有添加该保护,子进程启动时会重新导入整个主模块,不会执行目标sleep函数,这也是你看到的总运行时长只有0.14秒远低于预期1.5秒的核心原因,子进程根本没有正常执行目标逻辑。 - 其次是Jupyter Notebook的输出捕获限制:Jupyter内核默认只会捕获主进程的标准输出,子进程的打印内容默认不会重定向到当前单元格的输出区域,即便子进程正常执行,print内容也不会显示在notebook界面中。
解决方案
- 首先给多进程代码添加
if __name__ == '__main__'保护块,修正后的代码如下:
# -------------------------修正后的多进程代码--------------------------- # import multiprocessing import time def sleep(seconds): print("Sleeping {} second(s) ...".format(seconds)) time.sleep(seconds) print("Done Sleeping...") if __name__ == '__main__': start = time.perf_counter() processes = [] for _ in range(10): p = multiprocessing.Process(target=sleep, args=[1.5]) p.start() processes.append(p) for process in processes: process.join() finish = time.perf_counter() print("Finished in {} second(s) with multi-processing".format(round(finish-start,2)))
- 针对Jupyter输出捕获问题,可选择任意一种方案解决:
- 改用
concurrent.futures.ProcessPoolExecutor实现多进程逻辑,新版Jupyter对该库的子进程输出兼容性更好 - 将代码保存为
.py文件,直接使用本地Python解释器运行,可正常看到所有打印输出 - 若必须在Jupyter中使用旧的
multiprocessing.Process写法,可以手动将子进程的输出写入本地日志文件,后续读取文件查看输出内容
内容的提问来源于stack exchange,提问作者philuix
相关产品推荐
相关产品推荐

