You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Windows10下Jupyter Notebook中Python2.7 multiprocessing使用异常求助

解决Windows10+Python2.7+Jupyter Notebook中multiprocessing卡顿/无限报错问题

看起来你踩中了Python2.7在Windows环境下使用多进程的经典坑,再结合Jupyter的特殊运行机制,就出现了进程卡顿、CPU空转以及无限报错的情况。我来一步步帮你拆解问题并给出解决办法:

问题根源分析

  1. Windows多进程的机制限制:Windows没有Unix系统的fork机制,Python2.7的multiprocessing会通过创建新进程并重新导入主模块来启动子进程。如果你的代码没被if __name__ == '__main__':严格包裹,子进程启动时会重复执行创建进程池的代码,直接导致无限递归创建进程——这就是你在Anaconda提示符里看到无限循环报错的核心原因。
  2. Jupyter Notebook的环境特殊性:Jupyter内核的运行方式使得__name__变量的行为和普通脚本不一样,哪怕加了__name__判断,子进程也可能无法正确识别目标函数,最终导致进程卡在启动阶段,CPU核心显示运行但实际没有执行任务,使用率为0。
  3. 缺少进程等待逻辑:你的代码只调用了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

火山引擎 最新活动