Дублирование задач в 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
...