Django + 后台任务如何初始化

2024-05-27

我有一个基本的 django 项目,用作(Condor)计算集群的前端接口来生成模拟。用户可以从 django 应用程序开始模拟(在 Condor 中)。与仿真相关的元数据和仿真状态保存在数据库中。

我需要添加一个新功能:(某些)模拟完成时发出通知。

因为我想要一个简单的解决方案(并且我已经使用后台任务),所以我正在考虑使用重复任务,以固定的时间间隔查询 Condor 有关任务的信息,更新数据库,并在必要时发送通知。

因此,如果我想每 10 分钟更新一次状态,我将得到如下内容:

@background(schedule=1)
def check_simulations(repeat=600):
    # lookup simulation statuses
    simulation_list = get_Simulations()
    for sim in simulations_list:
       if sim.status == Simulation.DONE:
            user.email_user('Simulation Complete', 'You have been notified')

def initialize():
     check_simulations()

然而,这个任务(或者更好地说是initialize()方法)必须启动(调用一次)来创建和调度check_simulations()任务(这实际上会序列化调用并将其保存在数据库中);之后后台任务线程将读取它并执行并重新安排它(如果有错误)

我的问题:

  • 我应该把对initialize()方法的调用放在哪里,以便只运行一次?

例如,一个这样的地方可能是 urls.py,但这是一个极其丑陋的解决方案。有没有更好的办法 ?

  • 如何确保服务器重新启动不会创建和安排新任务(如果已经存在) 如果任务已经计划(因此序列化任务位于后台任务表中)并且重新启动网络服务器,则可能会发生这种情况,因此再次调用initialize()方法,从而创建并计划新任务...

我有一个类似的问题,我用这种方法解决了。

我在 urls.py 中初始化我的任务,我不知道你是否可以使用其他地方来放置它,还添加了 和 if,以检查任务是否已在数据库中准备好

from background_task.models import Task
if not Task.objects.filter(verbose_name="update_orders").exists():
   tasks.update_orders(repeat=300, verbose_name="update_orders")

我已经测试过它,它工作正常,您还可以使用其他参数(例如名称,哈希,...)搜索订单。

您可以在此处检查任务模型:https://github.com/arteria/django-background-tasks/blob/master/background_task/models.py https://github.com/arteria/django-background-tasks/blob/master/background_task/models.py

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django + 后台任务如何初始化 的相关文章

随机推荐