在 init 上加载大型数据结构,以便稍后 celery 任务重复使用(Django/Celery)

Rya*_*yan 6 django celery

我的 celery 任务之一需要访问非常大的数据结构。这种模型一旦加载就会占用大量内存,并且需要很长时间才能完成。

我试图避免多次加载,每次我调用“score_model”。最好,我想在初始化时将此数据加载到内存中,以便在需要时仅可用于此任务。

(通常pickle 效果很好,但是这个模型不容易序列化,所以我不能在缓存中设置它。它需要一个复杂的自定义后端,我不相信它会节省大量时间。)

celery 文档建议我应该创建一个基类。这个 SO 答案也非常有帮助使用 Celery 使用参数初始化一个工人

答案暗示在初始化时使对象可用以供以后使用,并且可以很好地集中通用功能,在跨工作人员使用时保持会话打开。以下代码有效:

tasks.py

from celery import Task
from celery.decorators import task

class startup(Task):
    abstract = True
    def __init__(self):
        print "Loading..."
        self.score_model= load_and_bin('/opt/model.tar')

@task(base=startup, bind=True, name="scoring")       
def scoring(self, pk):
    data = entries.objects.filter(geo_pk=pk)
    newscores = score_model(data)
Run Code Online (Sandbox Code Playgroud)

...然而,这会在初始化时多次将我的模型加载到内存中 - 甚至启动 celery beat(不运行此任务)甚至花。我可以不止一次看到那个小印刷品,但我不知道为什么。所以我很快就耗尽了资源。通过删除 abstract=True 注册这个类仍然有效,但我会更快地耗尽资源。

如何运行 load_and_bin 一次,并在以后使用此对象?我从芹菜开始:celery -A app worker