我有一个任务,我想每分钟运行,所以数据是尽可能新鲜的。但是,根据更新的大小,它可能需要超过一分钟的时间才能完成。Django-Q创建新任务并每分钟对其进行排队,因此有一些重叠,几乎同步相同的数据。是否有可能不安排已经在进行的任务?
发布于 2022-10-10 10:54:17
最后,我创建了锁任务执行的装饰器,在新任务上,如果锁不可用,运行就会立即返回。超时为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
...https://stackoverflow.com/questions/73987331
复制相似问题