Python 防止Celery Beat运行相同的任务
我有一个计划芹菜运行任务每30秒。我有一个任务每天运行,另一个任务每周在用户指定的时间和日期运行。它检查“开始时间”和“下一个计划日期”。在任务完成之前,下一个计划日期不会更新Python 防止Celery Beat运行相同的任务,python,django,celery,django-celery,celerybeat,Python,Django,Celery,Django Celery,Celerybeat,我有一个计划芹菜运行任务每30秒。我有一个任务每天运行,另一个任务每周在用户指定的时间和日期运行。它检查“开始时间”和“下一个计划日期”。在任务完成之前,下一个计划日期不会更新 然而,我想知道如何确保芹菜节拍只运行一次任务。我现在看到,芹菜将多次运行某个任务,直到该任务的下一个计划日期被更新。为了做到这一点,您需要实现某种“分布式锁”,解决这个问题的一种简单可靠的方法是使用带有memcached backend的django缓存并设置一个“标志”当任务开始时,然后在任务完成之前删除该标志。另一种
然而,我想知道如何确保芹菜节拍只运行一次任务。我现在看到,芹菜将多次运行某个任务,直到该任务的下一个计划日期被更新。为了做到这一点,您需要实现某种“分布式锁”,解决这个问题的一种简单可靠的方法是使用带有memcached backend的django缓存并设置一个“标志”当任务开始时,然后在任务完成之前删除该标志。另一种选择是使用“redis”锁作为“分布式锁”。 使用django cache memcached作为后端的示例:
@shared_task
def my_task(arg1, arg2, lock_expire=300):
lock_key = 'my_task'
acquire_lock = lambda: cache.add(lock_key, '1', lock_expire)
release_lock = lambda: cache.delete(lock_key)
if acquire_lock():
try:
# Execute your code here!
except Exception:
# error handling here
finally:
# release allow other task to execute
release_lock()
else:
print("Other task is running, skipping")
上面的代码实现了一个“分布式锁”,以确保无论您再次尝试执行多少次,都只能运行一个任务。
锁只能由一个任务获得:),另一个任务将跳过“主块”并完成。
这对你有意义吗
玩得开心 我试过了,但我的任务仍在重复。我还从芹菜日志中看到这条消息:“WARNING/Worker-3]/usr/lib/python2.7/site packages/django/core/cache/backends/base.py:224:cachekewarning:cache key包含如果与memcached:u一起使用会导致错误的字符:1:tasks对象“CacheKeyWarning”您使用什么作为“key”?似乎您正在尝试使用任务本身。在这种情况下,事情可能会出错。这很好,正如我之前指出的,您应该使用“字符串”,类似于“我的唯一任务”。谢谢嗨,马丁·阿尔德雷特,我不知道绳子应该做什么。字符串应该与什么关联?谢谢嘿@shizznetz,我刚刚读了这篇评论。根据您的需求,字符串“lock_key”应该是任务的标识符。例如,如果您希望一次只为给定用户执行一个任务,在这种情况下,您可以使用如下方式作为lock_key:'my_task:{0}'。format(user.id)希望您能理解!提前谢谢!