Django + background-tasks如何初始化
Django + background-tasks how to initialize
我有一个基本的 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() 任务(这实际上将序列化调用并将其保存在D B);之后后台任务线程将读取它并执行并重新安排它(如果有错误)
我的问题:
- 我应该将对 initialize() 方法的调用放在哪里才能 运行 一次?
一个这样的地方可能是 urls.py,但这是一个非常丑陋的解决方案。有没有更好的方法?
- 如何确保服务器重启不会创建和安排新任务(如果已经存在)
如果任务已经安排好(因此序列化任务在后台任务 table 中)并且网络服务器重新启动因此再次调用 initialize() 方法以便创建并安排新任务,则可能会发生这种情况。 .
我遇到了类似的问题,我是这样解决的。
我在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
我有一个基本的 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() 任务(这实际上将序列化调用并将其保存在D B);之后后台任务线程将读取它并执行并重新安排它(如果有错误)
我的问题:
- 我应该将对 initialize() 方法的调用放在哪里才能 运行 一次?
一个这样的地方可能是 urls.py,但这是一个非常丑陋的解决方案。有没有更好的方法?
- 如何确保服务器重启不会创建和安排新任务(如果已经存在) 如果任务已经安排好(因此序列化任务在后台任务 table 中)并且网络服务器重新启动因此再次调用 initialize() 方法以便创建并安排新任务,则可能会发生这种情况。 .
我遇到了类似的问题,我是这样解决的。
我在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