我的 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
| 归档时间: |
|
| 查看次数: |
439 次 |
| 最近记录: |