如何在Django应用程序中使用celery执行任务?

时间:2012-08-12 19:12:30

标签: python django cron celery django-celery

我发布了一个问题:How to execute a command at exact time once a day in Django?

我得到了答案,芹菜是最简单的选择,但现在我有另外一个关于芹菜的问题:

from celery.schedules import crontab

CELERYBEAT_SCHEDULE = {
    # Executes every Monday morning at 7:30 A.M
    'every-monday-morning': {
        'task': 'tasks.add',
        'schedule': crontab(hour=7, minute=30, day_of_week=1),
        'args': (16, 16),
    },
}

关于上述代码我有三个问题,即:

  • 我必须执行execute_command(User, command)方法。我希望这个方法将在给定的预定时间执行。

  • 如果我想更改7:30 AM but every weekdays的时间表怎么办?

  • args怎么样?在我的情况下,我应该从User and command传递args的值。或者我可以简单地从task键传递?

我刚刚阅读了芹菜的文档,但没有得到我的答案。你能帮帮我吗?

1 个答案:

答案 0 :(得分:4)

您找到了Celery periodic tasks documentation吗?

  • 您必须使用方法的标识符来注册调度程序条目。如果您的execute_command任务位于名为foobar的模块中,则task结构的CELERYBEAT_SCHEDULE值应为foobar.execute_command

    Celery将为您导入任务,前提是import foobar.execute_command可以正常工作。

  • 检查celery.schedule.crontab API;以下应在工作日上午07:30执行:

    crontab(minute=30, hour=7, day_of_week=’mon-fri’)
    
  • 请记住,此任务将以异步方式执行。在计划此任务时,您无法查询数据库对象,并且在调用任务时仍希望它仍在那里。

    因此,您应该只传递保持不变的python值,并让您的任务连接到数据库并根据您传入的参数进行查找。

    如果此任务只是为一个特定用户执行任务,那么无论如何都要传入该用户的标识符(用户ID,电子邮件,以及用于从数据库中查找用户的任何内容)。 / p>