首页 > 解决方案 > 如何在每个时间段后重新加载 settings.py(Django) 中定义的一些常量?

问题描述

我有一个训练有素的模型,它存储在 redis(cache) 中。为了最小化响应时间,我在settings.py服务器启动时加载它。模型每 2 小时更改一次(训练),所以我需要不断地重新获取它。

MODEL = pickle.loads(redis_connection.get('model'))

如何在 settings.py 保持不变的情况下,基本上从 redis 重新获取模型来更新这个常量?

标签: django

解决方案


我认为将其放入settings.py文件中并不是一个好主意。settings.py应该包含良好的设置

但是,您可以添加例如模型的名称,以便轻松更改该部分。例如:

# settings.py
MODEL_NAME = 'model'

然后你可以构造一个基本上像缓存一样的函数,并定期刷新获取模型:

# utils.py
from datetime import datetime, timedelta

from django.conf import settings

from pickle import loads as ploads

def get_model():
    if get_model.model is None or datetime.now() > get_model.exires:
        get_model.model = ploads(redis_connection.get(settings.MODEL_NAME))
        get_model.expires = datetime.now() + timedelta(hours=2)
    return get_model.model


get_model.model = None
get_model.expires= datetime.now()

因此,该函数检查模型是否已经存储在缓存中,并且仍然有效。如果不是,它会获取模型的(新版本)并存储它。这种方法的优点是,如果您的服务器没有收到与模型有关的请求。我们不会无缘无故地获取新模型并将其加载到系统中。

另一种方法是在某处拥有这样的缓存,例如在线程中安排一些任务以定期获取新版本(因此本身不是需要,而是抢先)。


推荐阅读