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

时间:2017-01-10 11:57:52

标签: python celery

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

我阅读了文档,但无法找到任何此类示例。

2 个答案:

答案 0 :(得分:3)

如果您坚持使用Celery

要在指定时间运行任务,在Celery中通常会使用periodic task,这通常是一项重复性任务。

但是,您可以创建一个具有非常特定的计划和条件的定期任务,该计划和条件仅发生一次,因此只运行一次。

很遗憾,我们只能specify这么多,例如我们可以指定hourminuteday_of_monthmonth_of_year,但我们无法指定year

然而,有了这个,你的任务每年最多运行1次,所以下面是一些解决方法:

运行后取消预定

一旦运行取消计划它应该相对容易(你有1年的时间!)

使用" DONE"任务完成时标记

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

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

简单的cron / Os级别调度程序也适用

您也可以完全跳过Celery并使用某些操作系统级设施(如cron)来实现类UNIX系统more on that here

总体思路保持不变。

答案 1 :(得分:2)

调用任务时可以使用参数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,但要确保一次只执行一次,则可以使用锁定-文档中的更多内容:{{3} }