Windows10下Jupyter Notebook中Python2.7 multiprocessing使用异常求助
解决Windows10+Python2.7+Jupyter Notebook中multiprocessing卡顿/无限报错问题
看起来你踩中了Python2.7在Windows环境下使用多进程的经典坑,再结合Jupyter的特殊运行机制,就出现了进程卡顿、CPU空转以及无限报错的情况。我来一步步帮你拆解问题并给出解决办法:
问题根源分析
- Windows多进程的机制限制:Windows没有Unix系统的
fork机制,Python2.7的multiprocessing会通过创建新进程并重新导入主模块来启动子进程。如果你的代码没被if __name__ == '__main__':严格包裹,子进程启动时会重复执行创建进程池的代码,直接导致无限递归创建进程——这就是你在Anaconda提示符里看到无限循环报错的核心原因。 - Jupyter Notebook的环境特殊性:Jupyter内核的运行方式使得
__name__变量的行为和普通脚本不一样,哪怕加了__name__判断,子进程也可能无法正确识别目标函数,最终导致进程卡在启动阶段,CPU核心显示运行但实际没有执行任务,使用率为0。 - 缺少进程等待逻辑:你的代码只调用了
pool.close()却没加pool.join(),主进程可能在子进程完成前就提前结束,导致资源无法正常释放,加重卡顿问题。
具体解决方案
方案1:修正代码逻辑(解决Anaconda提示符运行报错)
先把代码调整为符合Windows多进程规范的写法,补上join()并确保所有创建进程的逻辑都在__name__判断内:
import multiprocessing def foo(x): return x**2 if __name__ == '__main__': n_cpu = multiprocessing.cpu_count() pool = multiprocessing.Pool(processes=n_cpu) res = pool.map(foo, [1,2,3]) print(res) # 加上打印结果验证执行情况 pool.close() pool.join() # 必须等待子进程全部完成再结束主进程
这样在Anaconda提示符里运行,应该就能正常输出结果,不会再出现无限循环报错了。
方案2:适配Jupyter Notebook的运行方式
Jupyter里直接用multiprocessing.Pool容易出问题,你可以试试两种变通方式:
方式A:将代码存为独立脚本,用
%run执行
把上面修正后的代码保存为multiprocess_test.py,然后在Jupyter单元格里运行:%run multiprocess_test.py这种方式模拟了普通脚本的运行环境,能避开Jupyter内核的
__name__异常问题。方式B:用
multiprocessing.dummy线程池替代(非CPU密集型场景适用)
如果你的测试任务不是纯CPU密集型,可以用线程池来代替进程池,它的API和multiprocessing.Pool完全一致,不会有Windows进程启动的各种坑:from multiprocessing.dummy import Pool def foo(x): return x**2 pool = Pool() res = pool.map(foo, [1,2,3]) print(res) pool.close() pool.join()
方案3:升级Python版本(长期最优解)
Python2.7已经停止维护多年,它的multiprocessing模块在Windows下有很多遗留问题。如果条件允许,建议升级到Python3.6+,新版本的多进程模块对Windows的支持更完善,在Jupyter里也能稳定运行多进程代码。
内容的提问来源于stack exchange,提问作者pkz




