При количестве используемых веркеров больше одного, задача может отработать несколько раз. Порой такое поведение не нужно. И для такого случая Celery даже предлагает решение.
Почему-то подумалось, что декоратор метода класса будет удобней.
# -*- coding: utf-8 -*-
from django.core.cache import caches
cache = caches['persistent']
EXPIRE_TIME = 60 * 10
CACHE_KEY_TMPL = 'celery_task_lock_%s'
def unique_at_time(meth_name):
'''
Заставляет задачу выполняться лишь 1 раз в единицу времени.
Протестировано только на методах класса! На функциях - нет.
'''
key = CACHE_KEY_TMPL % meth_name
def wrap(fn):
def wrapped(self, *args, **kwargs):
if not cache.get(key):
cache.set(key, 1, EXPIRE_TIME)
result = fn(self, *args, **kwargs)
cache.delete(key)
return result
return wrapped
return wrap
Комментариев нет:
Отправить комментарий