【问题标题】:How to add expiry date in HUEY dynamic periodic task just like in celery tasks?如何像在 celery 任务中一样在 HUEY 动态周期性任务中添加到期日期?
【发布时间】:2021-04-09 07:00:55
【问题描述】:

有没有办法为 Huey Dynamic 定期任务添加到期日期? 就像 celery 任务中有一个选项一样 - “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 天后重复)

有更好的方法吗? 谢谢你的帮助。

【问题讨论】:

  • 请格式化代码并指出代码片段

标签: django cron django-celery periodic-task python-huey


【解决方案1】:

最佳解决方案将取决于您需要这种具有特定结束日期的定期任务功能的频率,但理想的方法可能涉及您的数据库。

我会创建一个数据库模型(我们称之为Job),其中包含end_date 的字段、next_execution_date 和指示重复之间的interval 的字段(例如 x 天)。

然后,您将使用 huey 创建一个每天运行的定期任务(如果您需要更精细的控制,甚至可以每小时/分钟运行一次)。每次运行此定期任务时,您都会检查所有 Job 实例并检查它们的 next_execution_date 是否在过去。如果是这样,请启动一个新的 Huey 任务,该任务实际上执行您需要为每个 Job 实例定期执行的功能。成功后,您使用interval 计算新的next_execution_date

所以当你想要一个新的Job 和一个新的end_date 时,你可以在 django admin 中创建它(或为它创建一个界面),然后你可以将 next_execution_date 设置为你的第一个日期希望它执行。

因此,您的最终解决方案将具有 Job 模型和两个 huey 装饰函数。一个用于定期任务,仅检查是否需要执行Job 实例并更新它们的next_execution_date,另一个用于实际执行每个Job 实例的定期功能。这样您就不必进行任何手动取消,并且您只需要 1 个定期任务,该任务无限期地运行,但如果没有需要运行的 Job 实例,则实际上不会执行任何操作。

注意:只有当您有多个此类任务并且您可能希望控制界面中的end_dates 时,这才是合理的方法。

【讨论】:

  • 感谢您的回答。它真的非常高效。我实施了您的解决方案并且效果很好。
  • 很高兴能帮上忙!
最近更新 更多