VS Code中Python3.7运行matplotlib循环绘图报线程与内存错误
问题根因分析
你遇到的两类报错本质都来自matplotlib批量绘图时的内存泄漏:
- 非调试模式下内存持续占用直到触达32位Python的2GB寻址上限,直接触发
MemoryError - 调试模式下debugpy需要额外创建线程做代码跟踪,内存耗尽后系统无法为新线程分配资源,才会抛出
RuntimeError: can't start new thread,和VS Code后台进程无关。
你提供的测试代码存在两个明显的资源释放问题:
- 没有指定matplotlib后端,默认调用带GUI交互的后端,批量绘图时会残留大量GUI相关的缓存资源
- 混用了全局
plt操作和fig对象操作,plt.close()未指定关闭对象时只会清理当前活动画布,导致大部分旧画布资源没有被释放,多次重复调用clear()/clf()没有实际作用
修复方案
1. 切换非交互后端(必改)
批量绘图不需要GUI渲染,在导入pyplot之前强制指定非交互后端Agg,可以避免大部分不必要的缓存开销:
import matplotlib matplotlib.use('Agg') # 该行必须放在import matplotlib.pyplot之前 import matplotlib.pyplot as plt import gc # 可选,用于主动触发垃圾回收
2. 简化清理逻辑
去掉冗余的clear操作,每次循环结束后明确关闭当前画布并删除引用:
door = 0 while True: door += 1 # 不需要指定num、clear参数,每次生成全新画布即可 fig, ax = plt.subplots(3, 1, sharex='all', figsize=(11.25, 6)) print(door) # 此处插入你的绘图、保存逻辑 # 清理步骤 plt.close(fig) # 明确指定要关闭的画布对象 del fig, ax gc.collect() # 可选,内存上涨明显时加上主动回收
3. 可选优化
你当前使用的是32位Python3.7,32位程序的最大内存寻址上限为2GB,是你运行到250次就崩溃的直接原因,有条件可更换为64位Python,可支持更高的内存占用上限。
排查监控指标
- 非调试模式:监控Python进程的私有内存占用,修复后内存应稳定在固定区间,不会随循环次数持续上涨
- 调试模式:除内存外额外监控Python进程的线程数,正常运行时线程数应稳定在个位数,不会持续增长
内容的提问来源于stack exchange,提问作者Neduhamel
相关产品推荐
相关产品推荐

