我有一个昂贵的模块导入(它涉及下载一个~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)
的形式导入。
答案 0 :(得分:0)
为webserver创建一个重复的tasks.py文件,该文件具有空任务且没有不需要的导入。
对于芹菜使用版本1,您只需导入一次而不是每次调用该任务。
去过那里,它有效。