如何使用 celery 安排任务在特定时间执行?

Posted

技术标签:

【中文标题】如何使用 celery 安排任务在特定时间执行?【英文标题】:How can I schedule a Task to execute at a specific time using celery? 【发布时间】:2010-12-31 17:21:56 【问题描述】:

我已经查看了PeriodicTask,但这些示例仅涉及使其重复发生。我正在寻找更像cron 的能力,可以说“每周一凌晨 1 点执行此任务”

【问题讨论】:

【参考方案1】:

使用

YourTask.apply_async(args=[some, args, here], eta=when)

在任务结束时,将其重新安排到下一次应该运行的时间。

【讨论】:

别忘了 eta 是 python 的日期时间, 如果我把它设为PeriodicTask,我只需要第一次安排,对吧?【参考方案2】:

感谢 Patrick Altman,最近发布的 1.0.3 版现在支持这一点!

例子:

from celery.task.schedules import crontab
from celery.decorators import periodic_task

@periodic_task(run_every=crontab(hour=7, minute=30, day_of_week="mon"))
def every_monday_morning():
    print("This runs every Monday morning at 7:30a.m.")

查看更新日志了解更多信息:

http://celeryproject.org/docs/changelog.html

【讨论】:

导入路径已更改为from celery.task import periodic_taskfrom celery.schedules import crontab【参考方案3】:

我刚刚提交了一个补丁来添加一个 ScheduledTask 来完成一些基于时间的调度与基于周期的调度:

https://github.com/celery/celery/commit/e8835f1052bb45a73f9404005c666f2d2b9a9228

【讨论】:

【参考方案4】:

虽然@asksol 的回答仍然成立,但 API 已更新。对于 celery 4.1.0,我必须导入 crontabperiodic_task 如下:

from celery.schedules import crontab
from celery.task import periodic_task

【讨论】:

【参考方案5】:

你如何阅读这个tutorial,你可以制作一个 PeriodicTask,我想如果你在凌晨 1 点执行了一个任务。周一早上是因为你想运行一个很长的 cpu/mem 操作,记住 celery 使用 ampq 进行入队任务。

【讨论】:

以上是关于如何使用 celery 安排任务在特定时间执行?的主要内容,如果未能解决你的问题,请参考以下文章

Heroku/Celery:一名工人同时执行任务?

安排 Django Celery 定期任务从某个时间运行到另一个时间

使用 Django 和 celery 在特定时间安排电子邮件

安排常规活动:Cron/Cron 替代品(包括 Celery)

通过 Django-celery 调度数千个一次性(非重复性)任务以实现近乎同时执行

如何从 django 前端安排任务?