Windows环境下基础Python并行程序运行卡顿问题排查
先看你运行的这段来自Python官方文档的并行处理示例代码:
from multiprocessing import Pool def f(x): return x*x if __name__ == '__main__': p = Pool(5) print(p.map(f, [1, 2, 3]))
在Windows 10的Anaconda Spyder环境里出现卡顿,主要是这几个原因导致的:
Windows进程机制与Spyder交互环境的冲突
Windows系统下,Python的multiprocessing模块默认用spawn方式创建子进程(Python 2里是基于win32 API的进程创建逻辑),这种方式会重新导入主脚本模块。而Spyder的IPython控制台是交互式运行环境,子进程启动时很容易和主控制台的IO流、资源管理产生冲突,导致进程无法正常初始化或输出阻塞,最终表现为程序卡顿。Spyder的IPython内核限制
Spyder依赖IPython内核运行代码,交互式环境的进程创建逻辑和普通命令行脚本完全不同。子进程的标准输出/错误会被IPython的重定向机制干扰,导致子进程无法正常完成任务并返回结果,程序就卡在那里了。Python 2的兼容性问题
你用的是Python 2的示例代码,但现在Spyder对Python 2的支持已经非常有限,Anaconda环境里的Python 2包也存在不少兼容性问题,进一步加剧了进程创建时的异常。
给你几个可行的解决办法:
改用外部终端运行脚本
在Spyder里,点击运行按钮旁的下拉菜单,选择「Run in external system terminal」。脚本会在独立的系统终端中运行,和Spyder的IPython控制台环境完全分离,避免交互环境的冲突,子进程能正常启动执行。切换到Python 3环境
Python 3对multiprocessing模块的Windows支持做了大量优化,稳定性远优于Python 2。这段代码几乎不需要修改,迁移到Python 3环境后再运行,卡顿问题大概率会消失。修改进程启动方式(Python 3+适用)
如果用的是Python 3,可以在代码开头添加一行,将进程启动方式设置为forkserver,这种方式比默认的spawn更适配交互式环境:
import multiprocessing multiprocessing.set_start_method('forkserver')
再运行代码,看看是否能解决卡顿问题。
内容的提问来源于stack exchange,提问作者Theodosis Siomos

