防止Celery Beat运行相同的任务

时间:2015-07-30 18:03:57

标签: python django celery django-celery celerybeat

我每隔30秒就有一个预定的芹菜运行任务。我有一个每天运行任务,另一个每周运行一次用户指定的时间和星期几。它会检查"开始时间" "下一个预定日期"。在任务完成之前,下一个计划日期不会更新。

但是,我想知道如何确保芹菜节拍只运行一次任务。我现在看到,芹菜将多次执行某项任务,直到该任务的下一个预定日期更新为止。

1 个答案:

答案 0 :(得分:3)

为了做到这一点,你需要实现某种“分布式锁”,这个问题的简单可靠方法是使用带有memcached后端的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")

上面的代码实现了“分布式锁定”,以确保只有一个任务可以运行,无论您尝试再次执行多少次。 锁只能通过一个任务获取:),另一个只是跳过“主程序段”并完成。  这对你有意义吗?

玩得开心!