如何在给定时间运行芹菜任务,但只能运行一次?
我阅读了文档,但无法找到任何此类示例。
答案 0 :(得分:3)
要在指定时间运行任务,在Celery中通常会使用periodic task,这通常是一项重复性任务。
但是,您可以创建一个具有非常特定的计划和条件的定期任务,该计划和条件仅发生一次,因此只运行一次。
很遗憾,我们只能specify这么多,例如我们可以指定hour
,minute
,day_of_month
和month_of_year
,但我们无法指定year
然而,有了这个,你的任务每年最多运行1次,所以下面是一些解决方法:
运行后取消预定
一旦运行取消计划它应该相对容易(你有1年的时间!)
使用" DONE"任务完成时标记
在某处写入标记(磁盘或数据库),您可以先检查任务是否已经运行,即if done: exit
如果年份不正确则退出
或者你想要安全,只需将代码添加到检查年份的任务中,例如if year != 2017: exit
。
您也可以完全跳过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} }