Django+背景任务如何初始化

2024-06-10 12:44:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个基本的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()方法的调用放在哪里只运行一次?在

一个这样的地方可以是网址.py但这是一个极其丑陋的解决方案。有更好的方法吗?在

  • 如何确保服务器重新启动不会创建和计划新任务(如果已经存在) 如果已经计划了一个任务(因此在background tasks表中有一个序列化的任务),并且web服务器重新启动,以便再次调用initialize()方法,从而创建并计划新任务,则可能会发生这种情况。。。在

Tags: django方法数据库状态defcheck解决方案list
1条回答
网友
1楼 · 发布于 2024-06-10 12:44:27

我也遇到过类似的问题,我就这样解决了。在

我在中初始化任务网址.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")

我已经测试过了,它工作得很好,你也可以用其他参数搜索订单,比如name,hash,。。。在

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

相关问题 更多 >