问题描述
有没有办法为 Huey Dynamic 周期性任务添加到期日期? 就像芹菜任务中有一个选项 - “some_celery_task.apply_async(args=('foo',),expires=expiry_date)” 在创建任务时添加到期日期。
我想在创建 Huey Dynamic 周期性任务时添加到期日期。我使用了“撤销”,它按预期工作,但我想在到期日期后完全停止任务而不是撤销它。当 Huey 动态周期任务被撤销时 - Huey 终端上会显示消息,提示huey 函数被撤销(每当 crontab 条件变为真)。 (我在 Django 中使用 Huey)
(额外) 我做了什么来满足这个到期日的需要 - 我创建了为 crontab 返回 Days - Months 对的函数: 例如。 开始日期 = 2021-1-20 ,结束日期 = 2021-6-14 然后函数将返回 - Days_Month :[['20-31',1],['*','2-5'],['1-14','6']] 然后我调用 Huey Dynamic 周期任务(在本例中为 3 次)。 (Days_Month 函数将根据要求返回 Day-Months - Daily、Weekly、Monthly 或在 n 天后重复)
有没有更好的方法来做到这一点? 谢谢你的帮助。
解决方法
最好的解决方案将取决于您需要这种具有特定结束日期的周期性任务的功能的频率,但理想的方法可能是涉及您的数据库。
我会创建一个数据库模型(我们称之为 Job
),其中包含 end_date
的字段、一个 next_execution_date
和一个指示重复之间 interval
的字段(例如x天)。
然后,您将使用 Huey 创建一个每天运行的周期性任务(如果您需要更精细的控制,甚至可以每小时/分钟运行)。每次运行此周期性任务时,您都会检查所有 Job
实例并检查它们的 next_execution_date
是否过去。如果是这样,请启动一个新的 Huey 任务,该任务实际执行您需要在每个 Job
实例中定期执行的功能。成功后,您使用 next_execution_date
计算新的 interval
。
因此,无论何时您想要一个带有新 Job
的新 end_date
,您都可以在 django 管理员中创建它(或为其创建一个界面),然后您将设置 next_execution_date
作为您希望它执行的第一个日期。
因此,您的最终解决方案将具有 Job
模型和两个 Huey 修饰函数。一个用于仅检查是否需要执行 Job
实例并更新其 next_execution_date
的周期性任务,另一个用于实际执行每个 Job
实例的周期性功能。这样您就不必进行任何手动取消操作,您只需要 1 个周期性任务,该任务只是无限期运行,但如果没有需要运行的 Job
实例,则实际上不会执行任何操作。
注意:只有当您有多个这样的任务并且您可能想要控制界面中的 end_date
时,这才是一种合理的方法。