【问题标题】:Django update settings in Celery's async taskCelery 异步任务中的 Django 更新设置
【发布时间】:2018-09-06 11:15:53
【问题描述】:

我正在使用 celery 加载神经网络模型,并希望将加载的模型存储在设置中以进行快速预测。

所以在django.conf.settings 我有:

MODELS = {}

在 celery 任务中,我有以下 sn-p:

@app.task
def load_nn_models(model_name):
     from django.conf import settings
     ...    
     settings.MODELS[model_name] = {'model': net, 'graph': sess}

但是,我注意到任务正在另一个线程中运行,该线程启动了不同的 Django 环境,并且设置中的任何更改都不会反映回主线程。

有解决办法吗?

编辑

我在设置中存储的参数是:

【问题讨论】:

  • @BearBrown 我认为它不会起作用,因为当 django 启动时,它会将设置读入字典并将该字典上的更改保留在文件中。因此,如果 main django 更改了某些内容,则异步任务将无法获取它。
  • 我添加一个例子

标签: python django celery django-celery


【解决方案1】:

显然,Django 设置不适合这样做。首先是因为settings 对象不是共享资源(每个进程只有一个实例),然后是因为the doc explicitely mentions that this object is to be considered as immutable

如果您的目的是让 celery 任务计算这些对象,以便其他任务和/或前端可以使用它们,您将必须找到一种方法来序列化它们并将序列化版本存储在共享资源(数据库,缓存等)。

【讨论】:

  • 我同意你的看法。但我能想到的唯一方法是将 nn 个模型存储为二进制流,因为将它们放在共享资源(如 db 或文件)中将花费太多时间来重新加载模型并对每个 API 请求进行预测。
  • 好吧,无论如何,这是一个完全不同的问题,而且您确实没有为某人提供足够的上下文来给出提示。我建议您发布一个新问题来解释真正的问题,而不是“您认为是解决方案”(XY 问题像往常一样),确保提供所有相关信息(如果这些对象是每个用户或网站的全局对象,他们多久改变一次,什么触发了改变,他们是多么“资源密集”——内存大小等等——等等等等)。还要确保您已经深入探索了这些库(keras 和 tf),有时会有半隐藏的功能。
【解决方案2】:

您可以尝试使用configparser 导入配置解析器

def dict_from_file():
    config = configparser.ConfigParser()
    config.read("config.ini")
    models = config['models']
    for x in models.values():
        print(x)

设置文件config.ini:

[models]
var_a: home
var_b: car
var_c: Next

调用dict_from_file,输出为:

home
car
Next

更新文件config.ini

[models]
var_a: home
var_c: New

调用dict_from_file 输出为:

home
New

ypu 可以通过supported-datatypes阅读更多内容

【讨论】:

  • 我现在明白了,homecar 可以是任何类型的对象吗?
  • @Coderji 你是什么意思对象? django模型还是python dict?添加支持类型的链接。
  • 对于我无法尝试和测试的额外对象,但我认为您可以通过来自文件的相同逻辑加载信息尝试使用yaml
猜你喜欢
  • 2016-12-13
  • 2011-11-22
  • 2020-05-08
  • 1970-01-01
  • 2014-12-10
  • 2019-12-15
  • 2018-11-13
  • 2011-09-17
  • 1970-01-01
相关资源
最近更新 更多