Django 使用 matplotlib 遇到 RuntimeError: main thread is not in main loop 解决办法

背景

在 django 开发的接口服务中需要返回由 matplotlib 生成的图片,第一次页面请求接口正常,刷新页面后出现了以下异常导致服务崩溃,

python 复制代码
    if self._tk.getboolean(self._tk.call("info", "exists", self._name)):
RuntimeError: main thread is not in main loop

这个 RuntimeError: main thread is not in main loop 看起来是 matplotlib 的依赖 tinker 库出现的问题。

问题分析

通常是因为 matplotlib 默认会使用 GUI 后端,而 Django 是一个 Web 框架,在服务器端运行,没有 GUI 环境,且 matplotlib 的 GUI 后端在非主线程的上下文中使用时会出现问题。以下是解决该问题的详细步骤和方法:

matplotlib 默认使用的后端(如 TkAgg)依赖于 GUI 环境,而 Django 运行在服务器端,没有这样的环境。并且在 Django 中,代码执行的线程上下文与 matplotlib 的 GUI 后端不兼容,导致出现 main thread is not in main loop 错误。

解决办法

更改 matplotlib 的后端

将 matplotlib 的后端更改为非 GUI 后端,例如 Agg,它可以在无 GUI 环境下生成图片。

python 复制代码
import matplotlib
matplotlib.use('Agg')  # 在导入 pyplot 之前设置后端
import matplotlib.pyplot as plt
相关推荐
fsnine10 分钟前
Python图形化界面——pyqt5教程
开发语言·python·qt
扶尔魔ocy1 小时前
python程序打包成win的exe应用(以OCR应用为例)
python·ocr·中文识别
Psycho_MrZhang1 小时前
自定义层和读写文件
pytorch·python·深度学习
似水流年 光阴已逝2 小时前
从Excel姓名匹配案例学Python:由点及面的系统化学习指南
开发语言·python·excel
这里有鱼汤2 小时前
量化的困局:当所有人都在跑同一个因子时,我们还能赚谁的钱?
后端·python
新子y2 小时前
【小白笔记】strip的含义
笔记·python
Q_Q19632884752 小时前
python+vue的在线租房 房屋租赁系统
开发语言·vue.js·spring boot·python·django·flask·node.js
空影星2 小时前
GridPlayer,一个好用的多视频同步播放器
python·flask·电脑·音视频
草莓熊Lotso2 小时前
《C++ Web 自动化测试实战:常用函数全解析与场景化应用指南》
前端·c++·python·dubbo
叼菠萝2 小时前
AI 应用开发三剑客系列:LangChain 如何撑起 LLM 应用开发基石?
python·langchain