You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多进程中Matplotlib绘图异常原因及并行绘图可行性咨询

并行进程中使用Matplotlib绘图的问题解析

结论:不能直接在multiprocessing进程池(Pool)中操作主进程创建的Matplotlib绘图对象(如Axes、Figure),这就是你代码里用multiprocessing Pool得到空白图甚至崩溃的原因。

原因解析

  • 进程内存隔离:multiprocessing创建的子进程拥有独立内存空间,主进程的ax、fig对象不会被共享。子进程里对这些对象的操作只是在修改副本,完全不会影响主进程里的真实绘图对象,最终显示的自然是空白图。
  • GUI资源冲突:Matplotlib的交互式绘图后端依赖主线程的GUI上下文管理,子进程直接操作绘图对象会打乱资源分配逻辑,引发信号量泄漏、进程崩溃,就像你补充代码里出现的资源追踪器警告和系统崩溃报告。
  • ThreadPool正常的原因:线程池内的线程共享主进程内存空间,能直接操作主进程创建的ax对象,不存在隔离问题,所以可以正常绘图。

可行解决方案

如果需要用多进程提升数据处理效率,正确的做法是让子进程只负责生成/处理绘图数据,再把数据返回给主进程,由主进程统一完成绘图:

import matplotlib.pyplot as plt
import numpy as np
from multiprocessing import Pool
from functools import partial

# 子进程仅处理数据,不碰绘图对象
def process_data(x, func):
    return func(x)

if __name__ == "__main__":
    x = np.linspace(0, 2 * np.pi, 100)
    funcs = [np.sin, np.cos]
    
    # 多进程处理数据
    with Pool(5) as p:
        y_arr = p.map(partial(process_data, x), funcs)
    
    # 主进程统一绘图
    fig, ax = plt.subplots()
    for yi in y_arr:
        ax.plot(x, yi)
    plt.show()

内容的提问来源于stack exchange,提问作者KCQs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 00:05:07