在Python / Django中实现背景“计时器”功能的最佳方法

问题描述

我正在尝试实现Django Web应用程序(在Python 3.8.5上),该应用程序允许用户创建“活动”,在其中定义活动持续时间,然后将活动状态设置为“进行中”。 视图的POST动作将写入新状态,持续时间和开始时间(当然,也可以在此添加基于开始时间和持续时间的结束时间)。 然后,后端应跟踪持续时间,并自动将状态更改为“完成”。 用户操作还可以在计算的结束时间之前将状态更改为“完成”(即不再需要跟踪计时器)。

我对Python还是很陌生,所以我需要一些有关实现这种概念的最聪明方法的建议吗?

它必须高效且可扩展-我目前使用的是Heroku Free帐户,因此系统资源有限,但是对于将来的生产实施,效率当然也很重要。

我看过Python线程计时器,它似乎可以在基本级别上使用,但是我无法确定这会对系统造成什么样的约束-例如生成的Timer线程是否可能阻止主线程完成和释放资源(即Heroku Dyno线程)等。
我已经读到持久性可能是个问题(如果服务器出现故障),并且我还没有找到一种从另一个进程中取消计时器的方法(.cancel()方法似乎依赖于取消原始对象,而且我不确定这是否可以通过其他过程实现。

我还想知道一种更“后台”的方法,即单个过程不断检查数据库,以查找达到其结束时间的活动记录并交换状态。
但是实现这种服务器的最佳方法是什么?
每秒读取数据库以查找结束时间为“现在”的记录是否可行?到达结束时间后,我需要实时更改状态。 像Celery这样的东西是一个不错的选择,还是对于这样的单个过程来说就算是过大了?

正如我所说的,我对这些技术还很陌生,所以我可能会错过其他明显的解决方案-请随时向我启迪! 预先感谢。

解决方法

要实现此目的,您需要某种计划任务功能。为了实现更快速,更简单的实现,最好使用来自 Timer 对象的 Threading模块。

更完整的解决方案是使用Celery。如果您是新手,那么深入了解它会为您提供一个有价值的价值,开始使用celery作为队列管理器,可以轻松地将您的工作分配到多个线程或进程中。

您提到您希望它高效且可扩展,因此我想您将希望实现类似的功能,这些功能需要多重处理和调度,因此,我的建议是使用芹菜。

您可以按照文档Integrate Django with Celery轻松地将其集成到Django应用程序中。