使用django + celery多次导入模块

时间:2015-08-10 18:59:40

标签: python django celery django-celery

我有一个昂贵的模块导入(它涉及下载一个~20MB的索引文件),这是芹菜工作者使用的。不幸的是,我无法弄清楚如何只将模块导入一次,而且只能由芹菜工人进行。

版本1 tasks.py文件:

import expensive_module

@shared_task
def f():
    expensive_module.do_stuff()

当我以这种方式组织文件时,Web服务器和芹菜实例都会导入昂贵的模块,这是我所期望的,因为tasks模块是在两者中导入的,而他们是&#39 ;差异过程。

版本2 tasks.py文件:

@shared_task:
def f():
    import expensive_module
    expensive_module.do_stuff()

在这个版本中,Web服务器从不导入模块(这很好),但每次调用f.delay()时,芹菜工作者都会重新导入模块。这真让我困惑。在这种情况下,为什么每次芹菜工作者运行此功能时都会重新导入模块?如何重新组织此代码以仅让芹菜工人导入昂贵的模块,并且只导入模块一次?

作为一个后续的,不那么重要的问题,在tasks.py文件的第1版中,为什么Web实例会导入昂贵的模块两次?当django运行urls.py时,它都会以self._urlconf_module = import_module(self.urlconf_name)的形式导入。

1 个答案:

答案 0 :(得分:0)

为webserver创建一个重复的tasks.py文件,该文件具有空任务且没有不需要的导入。

对于芹菜使用版本1,您只需导入一次而不是每次调用该任务。

去过那里,它有效。

相关问题