Windows环境下Jupyter Notebook中Python multiprocessing无法运行求助
解决Windows 10 Anaconda环境下Jupyter Notebook中multiprocessing.Pool卡住的问题
问题根源
Windows系统中multiprocessing默认采用spawn启动子进程,这会新建Python进程并重新导入主模块。但Jupyter Notebook的内核进程环境和普通脚本不同,__name__的处理逻辑导致子进程无法正确加载目标函数,最终引发代码卡住。而PyCharm(脚本运行环境)和Linux(默认用fork启动子进程)不受此问题影响。
可行解决方案
方法1:显式指定spawn上下文
在代码中明确指定spawn上下文启动进程池,同时确保函数定义在if __name__ == '__main__'代码块之外:
from multiprocessing import get_context def f(x): return x*x if __name__ == '__main__': with get_context('spawn').Pool(5) as p: print(p.map(f, [1, 2, 3]))
方法2:将函数拆分到独立模块
把需要并行执行的函数保存到单独的.py文件中(比如命名为mp_functions.py):
# mp_functions.py def f(x): return x*x
然后在Jupyter Notebook单元格中导入该函数并使用:
from multiprocessing import Pool from mp_functions import f if __name__ == '__main__': with Pool(5) as p: print(p.map(f, [1, 2, 3]))
方法3:改用concurrent.futures.ProcessPoolExecutor
concurrent.futures的进程池实现在Jupyter环境中兼容性更强,代码逻辑与multiprocessing.Pool接近:
from concurrent.futures import ProcessPoolExecutor def f(x): return x*x if __name__ == '__main__': with ProcessPoolExecutor(max_workers=5) as executor: results = list(executor.map(f, [1, 2, 3])) print(results)
方法4:用%run魔法命令执行脚本
把完整的多进程代码保存为.py文件(比如test_multiprocessing.py):
# test_multiprocessing.py from multiprocessing import Pool def f(x): return x*x if __name__ == '__main__': with Pool(5) as p: print(p.map(f, [1, 2, 3]))
然后在Jupyter Notebook单元格中用魔法命令运行该脚本:
%run test_multiprocessing.py
内容的提问来源于stack exchange,提问作者Roberto
相关产品推荐
相关产品推荐

