繁体   English   中英

Celery,在指定时间运行一次任务

[英]Celery, run task once at a specified time

如何在给定时间运行 celery 任务,但只能运行一次?

我阅读了文档,但找不到任何示例。

您可以在调用任务时使用参数eta 例子:

from datetime import datetime, timedelta

@app.task()
def hello(self):
    return 'hello world'


tomorrow = datetime.utcnow() + timedelta(days=1)
hello.apply_async(eta=tomorrow)

文档: http : //docs.celeryproject.org/en/latest/userguide/calling.html#eta-and-countdown

或者,当您想多次调用hello确保一次只执行一次时,您可以使用锁定 - 在文档中了解更多信息: http : //docs.celeryproject.org/en/latest/tutorials /task-cookbook.html#ensuring-a-task-is-only-executed-a-a-time

如果你坚持使用 Celery

要在指定的时间运行任务,在 Celery 中,您通常会使用周期性任务,这通常是重复性任务。

但是,您可以创建一个具有非常具体的计划和条件的周期性任务,该任务只发生一次,如此有效地只运行一次。

不幸的是,我们只能指定这么多,例如我们可以指定hourminuteday_of_monthmonth_of_year但我们不能指定year

但是,您的任务每年最多运行 1 次,因此以下是一些解决方法:

运行后取消调度

运行后取消计划应该相对容易(您有 1 年的时间这样做!)

任务完成时使用“DONE”标志

在某处(磁盘或数据库)写入标志,您可以首先检查任务之前是否运行过,即if done: exit

如果年份不正确或者您想要安全,请退出,只需将代码添加到检查年份的任务中,例如if year != 2017: exit

简单的 cron/Os 级别调度程序也可以工作

您也可以完全跳过 Celery 并使用一些操作系统级别的工具,例如用于类 UNIX 系统的 cron, 更多内容请点击此处

总体思路保持不变。

one_off中有一个名为one_off的布尔字段。 将其设置为true以在给定时间仅运行一次 celery 任务。

示例(以下代码为views.py的动态任务创建部分):

def test():
    schedule, created = CrontabSchedule.objects.get_or_create(hour=20, minute=6, day_of_month=1, month_of_year=9)
    task = PeriodicTask.objects.create(crontab = schedule, name = 'somename', task = 'core.tasks.methodnameintasks', one_off=True)

但是,该任务将保持启用状态,直到 celery beat 更新。 在现有任务中创建或更新新任务将解决此问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM