芹菜任务计划(芹菜,Django和RabbitMQ)

Jul*_*pov 10 rabbitmq celery django-celery

我想要一个每5分钟执行一次的任务,但它会等待最后一次执行完成,然后开始计算这5分钟.(这样我也可以确定只有一个任务在运行)我发现最简单的方法是运行django应用程序manage.py shell并运行它:

while True:
    result = task.delay()
    result.wait()
    sleep(5)
Run Code Online (Sandbox Code Playgroud)

但对于我想以这种方式执行的每个任务,我必须运行它自己的shell,有一个简单的方法吗?可能是一些国王定制d django芹菜调度器?

Ces*_*sar 17

哇,没有人理解这个人的问题真是令人惊讶.他们不是要求定期运行任务,而是如何确保Celery不会同时运行同一任务的两个实例.我认为没有办法直接用Celery做到这一点,但是你可以做的是让其中一个任务在开始时获得锁定,如果失败,则在几秒钟内再次尝试(使用重试) .任务将在返回之前释放锁定; 如果崩溃或超时,您可以在几分钟后使锁自动过期.

对于锁定,您可以使用您的数据库或Redis之类的东西.


Con*_*ens 16

您可能对这种简单的方法感兴趣,不需要更改芹菜conf.

@celery.decorators.periodic_task(run_every=datetime.timedelta(minutes=5))
def my_task():
    # Insert fun-stuff here
Run Code Online (Sandbox Code Playgroud)


Mau*_*cco 12

您需要的只是在celery conf witch任务中指定您想要定期运行以及使用哪个间隔.

示例:每30秒运行一次tasks.add任务

from datetime import timedelta

CELERYBEAT_SCHEDULE = {
    "runs-every-30-seconds": {
        "task": "tasks.add",
        "schedule": timedelta(seconds=30),
        "args": (16, 16)
     },
}
Run Code Online (Sandbox Code Playgroud)

请记住,您必须使用-B选项以节拍模式运行芹菜

manage celeryd -B
Run Code Online (Sandbox Code Playgroud)

您也可以使用crontab样式而不是时间间隔,结帐:

http://ask.github.com/celery/userguide/periodic-tasks.html

如果您正在使用django-celery,请记住您还可以使用tha django db作为定期任务的调度程序,这样您就可以轻松地通过django-celery管理面板添加新的定期任务.为此,您需要以这种方式在settings.py中设置celerybeat调度程序

CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler"
Run Code Online (Sandbox Code Playgroud)

  • 这样做的问题在于它不会等待任务完成,而是在它的时间(每30秒)发送另一个任务.或者可能是我错了? (2认同)
  • 如果要确保任务仅在最后一个任务完成后启动,请使用memcached(或django cache)在所述任务中创建对任务类型或资源的锁定.它易于实现且可扩展. (2认同)