要在指定的时间运行任务,在 Celery 中,您通常会使用周期性任务,这通常是重复性任务。
但是,您可以创建一个具有非常具体的计划和条件的周期性任务,该任务只发生一次,如此有效地只运行一次。
不幸的是,我们只能指定了这么多,例如我们可以指定hour,minute,day_of_month和month_of_year,但我们不能确定year
但是,您的任务每年最多运行 1 次,因此以下是一些解决方法:
运行后取消调度
运行后取消计划应该相对容易(您有 1 年的时间这样做!)
任务完成时使用“DONE”标志
在某处(磁盘或数据库)写入标志,您可以首先检查任务之前是否运行过,即 if done: exit
如果年份不正确
或者您想安全,请退出,只需将代码添加到检查年份的任务中,例如if year != 2017: exit.
您也可以完全跳过 Celery 并使用一些操作系统级别的工具,例如用于类 UNIX 系统的 cron,更多内容请点击此处。
总体思路保持不变。
您可以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)
Run Code Online (Sandbox Code Playgroud)
文档: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-一次执行一次
在PeriodicTask中有一个称为布尔字段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)
Run Code Online (Sandbox Code Playgroud)
但是,该任务将保持启用状态,直到 celerybeat 更新为止。创建新任务或更新现有任务将解决此问题。
| 归档时间: |
|
| 查看次数: |
2215 次 |
| 最近记录: |