我每30秒安排一次芹菜运行任务.我有一个每天作为任务运行,另一个每周在用户指定的时间和星期几运行.它检查“开始时间”和“下一个预定日期”.在任务完成之前,下一个计划的日期不会更新.
但是,我想知道如何确保芹菜节拍只运行一次任务.我现在看到,芹菜将多次运行某个任务,直到该任务的下一个计划日期已更新.
解决方法:
为了做到这一点,您需要实现某种“分布式锁定”,而解决此问题的一种简单可靠的方法是使用带有memcached后端的django缓存,并在任务开始时在其之前设置一个“标志”完成删除该标志.另一种选择是将“ redis”锁用作“分布式锁”.
使用django缓存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")
上面的代码实现了一个“分布式锁”,以确保只有一个任务可以运行,无论您尝试执行多少次.
只能通过一项任务来获得锁:),而另一项将仅跳过“主块”并完成.
这对您有意义吗?
玩得开心!