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
相关推荐
Lin_Aries_04217 分钟前
容器化 Flask 应用程序
linux·后端·python·docker·容器·flask
清静诗意14 分钟前
Django REST Framework (DRF) Router 注册流程详解
django
MediaTea18 分钟前
Jupyter Notebook:基于 Web 的交互式编程环境
前端·ide·人工智能·python·jupyter
阿_旭19 分钟前
基于深度学习的CT扫描图像肝脏肿瘤智能检测与分析系统【python源码+Pyqt5界面+数据集+训练代码】
人工智能·python·深度学习·肝脏肿瘤分割
belldeep1 小时前
python:Django 和 Vue.js 技术栈解析
vue.js·python·django
蓝桉~MLGT2 小时前
Python学习历程——基础语法(print打印、变量、运算)
开发语言·python·学习
小熊出擊2 小时前
[pytest] autouse 参数:自动使用fixture
python·测试工具·单元测试·自动化·pytest
诗句藏于尽头3 小时前
关于七牛云OSS存储的图片数据批量下载到本地
开发语言·windows·python
2401_841495643 小时前
【计算机视觉】图像去雾技术
人工智能·python·opencv·算法·计算机视觉·技术·图像去雾
在钱塘江3 小时前
Elasticsearch 快速入门 - Python版本
后端·python·elasticsearch