【问题标题】:Celery Task instanciation cacheCelery 任务实例化缓存
【发布时间】:2017-05-14 06:03:25
【问题描述】:

我正在尝试使用 Celery 4.0.2 在任务中缓存一个大型资源文件。

查看文档,我已经了解了任务缓存部分。

http://docs.celeryproject.org/en/latest/userguide/tasks.html#instantiation

这对缓存资源也很有用,例如缓存数据库连接的基本任务类:

from celery import Task

class DatabaseTask(Task):
    _db = None

    @property
    def db(self):
        if self._db is None:
            self._db = Database.connect()
        return self._db

在我的例子中,我做了一些更改来缓存我的大文件资源,以及它在任务之间共享的对象,但是大文件资源使用的内存被永久缓存在任务中。

from celery import Task

class BigResourceTask(Task):
    _resource = None

    @property
    def resource(self):
        if self._resource is None:
            self._resource = load_big_resource()
        return self._resource 

如何在所有相关任务执行后释放该内存或使其过期?

【问题讨论】:

    标签: python django caching celery


    【解决方案1】:

    由于您是在检查_resource 是否存在后按需创建它,因此您可以随时删除。

    # complete all the tasks
    del BigResourceTask._resource  # free memory
    
    # do something else
    
    r = BigResourceTask.resource  # create when needed
    

    【讨论】:

    • 感谢重播。我已经尝试过了,但这会为每个进程创建新资源。我试图为具有相同基本任务的所有进程提供某种共享对象。
    猜你喜欢
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    相关资源
    最近更新 更多