如何解决在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应用程序中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。