我想使用 celery 执行周期性任务。
根据文档:http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html#entries,我写下了以下代码:
app.conf.beat_schedule = {
'test_celery': {
'task': 'tasks.login.test_timertask',
'schedule': 60.0,
}
}
但是当我按如下方式运行时:
celery beat -A tasks.login --loglevel=info
第一个任务在60s后执行。
我想在工作人员启动后立即启动任务,而不是延迟 60 秒。我该怎么办?
您可以使用 crontab 计划 为此:
from celery.schedules import crontab
app.conf.beat_schedule = {
'test_celery': {
'task': 'tasks.login.test_timertask',
'schedule': crontab(), # default, executes every minute
}
}
但是您必须注意以下事项(如文档所述):
也存在类似 Crontab 的计划,请参阅 Crontab 部分 时间表。
与 cron 一样,如果第一个任务不执行,任务可能会重叠 在下一个之前完成。如果这是一个问题,你应该使用锁定 确保一次只能运行一个实例的策略(请参阅 示例 确保任务一次只执行一个)。
没有立即启动定期任务的设置,这太愚蠢了,所以我想唯一真正的解决方案是在将其添加为定期任务之前手动启动任务,或者使用您自己的调度程序类来设置之前的最后一次启动时间.