2

我发布了一个问题:如何在 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 commandfrom的值args。或者我可以简单地从task密钥传递?

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

4

1 回答 1

4

你找到Celery 定期任务文档了吗?

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

    只要可行,Celery 将为您导入任务import foobar.execute_command

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

    crontab(minute=30, hour=7, day_of_week=’mon-fri’)
    
  • 请记住,此任务将异步执行。当您计划此任务并期望在调用该任务时它仍然存在时,您无法查询数据库对象。

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

    如果这个任务只为一个特定的用户执行任务,那么一定要传入那个用户的标识符(用户 ID、电子邮件、任何你可以用来从数据库中查找用户的东西)。

于 2012-08-12T20:22:10.657 回答