Django开发服务器中如何仅加载一次PaddleOCR模型?
解决Django开发环境中PaddleOCR重复初始化的问题
Django开发服务器在DEBUG=True模式下,代码变动会触发进程热重载,这就是你每次改代码都要重新加载模型的原因。以下是两种可行的解决方案:
方案一:基于AppConfig+单例模式实现单次加载
这是推荐的方案,既能保留热重载的便利,又能确保模型只初始化一次。
- 创建工具模块封装模型初始化
在你的应用目录下新建ocr_utils.py,用单例模式管理PaddleOCR实例:
from paddleocr import PaddleOCR # 全局变量存储已初始化的模型 _ocr_instance = None def get_ocr_instance(): global _ocr_instance if _ocr_instance is None: # 这里填入你的PaddleOCR初始化配置 _ocr_instance = PaddleOCR(use_angle_cls=True, lang='ch') return _ocr_instance
- 通过AppConfig在进程启动时预加载模型
修改应用目录下的apps.py,利用ready方法在主进程启动时初始化模型,同时避免热重载时重复执行:
from django.apps import AppConfig import os class YourAppConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'your_app_name' # 替换成你的应用名称 def ready(self): # 仅在主进程执行初始化(热重载的子进程会跳过) if os.environ.get('RUN_MAIN') == 'true': from .ocr_utils import get_ocr_instance get_ocr_instance()
- 更新settings.py的INSTALLED_APPS
将应用名称替换为上述AppConfig的路径,确保Django加载自定义配置:
INSTALLED_APPS = [ # ... 其他应用 'your_app_name.apps.YourAppConfig', # 替换成实际路径 ]
之后在视图或其他业务代码中,只需调用get_ocr_instance()就能拿到已初始化的模型,无需重复加载。
方案二:禁用开发服务器的热重载(不推荐)
如果上述方案无法生效,可以通过禁用热重载强制模型只加载一次:
python manage.py runserver --noreload
但此方法的缺点是代码改动后需要手动重启服务器才能生效,会降低开发效率。
为什么之前的方案失效?
- settings.py初始化:Django热重载时会重新加载整个settings模块,导致其中的初始化代码重复执行。
- 线程方案:Django开发服务器的热重载是重启整个进程,线程无法跨进程保留,因此线程方案无法解决问题。
内容的提问来源于stack exchange,提问作者Irfan Shaikh
相关产品推荐
相关产品推荐

