为什么multiprocessing.Process在Jupyter和Spyder中运行不符合预期?
多进程代码在Jupyter/Spyder环境下未正常执行的原因与解决方法
根本原因
- Windows系统中
multiprocessing默认采用spawn模式启动子进程,该模式要求子进程重新导入主模块以获取要执行的目标函数。Jupyter Notebook、Spyder的交互内核运行时不会将代码生成本地可导入的.py文件,子进程启动时无法定位到代码中定义的do_something函数,会直接启动失败,因此函数逻辑完全没有执行,join()方法立刻返回,最终总耗时只有零点几秒。 - 你的代码缺少Windows平台运行多进程必须的
if __name__ == '__main__'入口保护,子进程导入主模块时会重复执行进程创建代码,进一步触发运行异常。
解决办法
方案1:本地脚本运行(兼容性最好)
将代码写入独立的.py文件,添加入口保护后通过python 文件名.py命令执行,修改后的可运行代码如下:
import multiprocessing import time def do_something(): print(f'Sleeping 5 second(s)...') time.sleep(5) print(f'Done Sleeping...') if __name__ == '__main__': start = time.perf_counter() p2 = multiprocessing.Process(target=do_something) p3 = multiprocessing.Process(target=do_something) p2.start() p3.start() p2.join() p3.join() finish = time.perf_counter() print(f'Finished in {round(finish-start, 2)} seconds')
运行后即可得到预期约5秒的耗时,同时输出子进程的打印内容。
方案2:交互环境测试方案
如果需要在Jupyter/Spyder中直接测试,可以先把do_something函数写入一个本地.py文件(例如my_func.py),再在交互环境中从该文件导入函数,同时保留if __name__ == '__main__'保护逻辑,子进程即可正常找到目标函数执行。
内容的提问来源于stack exchange,提问作者pingboing
相关产品推荐
相关产品推荐

