2016-12-29 3 views
1

Я пытаюсь кэшировать большой файл ресурсов среди задач с помощью Celery 4.0.2.Ключ инициализации сельдерея

Рассматривая его в документации, у меня есть доступ к кешированию задачи.

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

Это также может быть полезным для кэширования ресурсов, Например, базовый класс Task, который кэширует подключение к базе данных:

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 

Как я могу освободить эту память или завершить ее после выполнения всех связанных задач?

ответ

1

С момента создания _resource по запросу после проверки, существует ли он, вы можете просто удалить его, когда захотите.

# complete all the tasks 
del BigResourceTask._resource # free memory 

# do something else 

r = BigResourceTask.resource # create when needed 
+0

Спасибо за повтор. Я пробовал это, но это создает новые ресурсы для каждого процесса. Я пытался иметь какой-то общий объект для всех процессов с одной и той же базовой задачей. – PaytoN