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
相关推荐
Sirius.z5 小时前
第R6周:LSTM实现糖尿病探索与预测
python
名字还没想好☜5 小时前
Python f-string 进阶:数字格式化、对齐填充、调试 = 号与嵌套表达式
开发语言·数据库·python·字符串格式化·f-string
·薯条大王6 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
Dxy12393102166 小时前
Python 如何使用 MySQL 的事务
python·mysql
今儿敲了吗10 小时前
Python ——第三方包
笔记·python
麒麟水手11 小时前
国产银河麒麟系统开发实录:跑通Streamlit,我踩过的6个坑
python
麒麟水手11 小时前
麒麟系统部署检查清单:上线前30分钟,逐项自查这4类问题
python
用户03321266636712 小时前
使用 Python 在 PDF 中添加或删除数字签名
python
代码方舟13 小时前
零信任架构实战:基于天远柠檬查出险-登记证API构建自动化车辆履约评估网关
人工智能·python·架构·自动化
估值探索者13 小时前
【Python实时盯盘与预警 #08】成交额突然放大2倍?Python窗口比较抓异动
java·开发语言·python