【问题标题】:Django + background-tasks how to initializeDjango + 后台任务如何初始化
【发布时间】:2018-05-16 14:55:22
【问题描述】:

我有一个基本的 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() 方法以便创建和调度一个新任务,这可能会发生......

【问题讨论】:

    标签: python django background-task


    【解决方案1】:

    我遇到了类似的问题,我用这种方法解决了。

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

    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

    【讨论】:

      猜你喜欢
      • 2018-09-07
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      • 2015-03-23
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多