Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 防止Celery Beat运行相同的任务_Python_Django_Celery_Django Celery_Celerybeat - Fatal编程技术网

Python 防止Celery Beat运行相同的任务

Python 防止Celery Beat运行相同的任务,python,django,celery,django-celery,celerybeat,Python,Django,Celery,Django Celery,Celerybeat,我有一个计划芹菜运行任务每30秒。我有一个任务每天运行,另一个任务每周在用户指定的时间和日期运行。它检查“开始时间”和“下一个计划日期”。在任务完成之前,下一个计划日期不会更新 然而,我想知道如何确保芹菜节拍只运行一次任务。我现在看到,芹菜将多次运行某个任务,直到该任务的下一个计划日期被更新。为了做到这一点,您需要实现某种“分布式锁”,解决这个问题的一种简单可靠的方法是使用带有memcached backend的django缓存并设置一个“标志”当任务开始时,然后在任务完成之前删除该标志。另一种

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


然而,我想知道如何确保芹菜节拍只运行一次任务。我现在看到,芹菜将多次运行某个任务,直到该任务的下一个计划日期被更新。

为了做到这一点,您需要实现某种“分布式锁”,解决这个问题的一种简单可靠的方法是使用带有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)希望您能理解!提前谢谢!