Дублирование задач в Django-Q

У меня есть задача, которую я хочу выполнять каждую минуту, чтобы данные были как можно более свежими. Однако, в зависимости от размера обновления, его выполнение может занять более одной минуты. Django-Q создает новую задачу и ставит ее в очередь каждую минуту, поэтому происходит некоторое дублирование синхронизации одних и тех же данных. Возможно ли не ставить в очередь задачу, которая уже находится в процессе выполнения?

В итоге я создал декоратор, который блокирует выполнение задачи и при новом запуске задачи просто возвращается сразу, если блокировка недоступна. Таймаут составляет 1 час (достаточно в моем случае).

from functools import wraps

from django.core.cache import cache
from redis.exceptions import LockNotOwnedError


def django_q_task_lock(func):
    """
    Decorator for django q tasks for preventing overlap in parallel task runs
    """

    @wraps(func)
    def wrapped_task(*args, **kwargs):
        task_lock = cache.lock(f"django_q-{func.__name__}", timeout=60 * 60)
        if task_lock.acquire(blocking=False):
            try:
                func(*args, **kwargs)
            except Exception as e:
                try:
                    task_lock.release()
                except LockNotOwnedError:
                    pass
                raise e
            try:
                task_lock.release()
            except LockNotOwnedError:
                pass

    return wrapped_task

@django_q_task_lock
def potentialy_long_running_task():
    ...
    # task logic
    ...
Вернуться на верх