19 сентября 2014 г.

Выполнение задачи точно один раз в Celery

При количестве используемых веркеров больше одного, задача может отработать несколько раз. Порой такое поведение не нужно. И для такого случая 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

Комментариев нет:

Отправить комментарий