Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django计划任务超时_Django_Scheduled Tasks_Celery - Fatal编程技术网

Django计划任务超时

Django计划任务超时,django,scheduled-tasks,celery,Django,Scheduled Tasks,Celery,我在数据库中的实体上设置了一个超时,并为其指定了一个状态(活动/完成)。我想要的是在超时过期时将该实体的状态更改为finished。我正在考虑使用芹菜创建一个计划任务,该任务在创建对象时具有相关的超时,这反过来会触发django信号,通知对象已“过期”,然后在信号处理程序中将该值设置为finished。尽管如此,这似乎有点开销,我认为必须有一个更直接的方法来做到这一点 先谢谢你 不一定重量轻,但当我面对这个问题时,我有两种解决方案 首先,我编写了一个Django管理器,它将创建一个“待过期”对象

我在数据库中的实体上设置了一个超时,并为其指定了一个状态(活动/完成)。我想要的是在超时过期时将该实体的状态更改为finished。我正在考虑使用芹菜创建一个计划任务,该任务在创建对象时具有相关的超时,这反过来会触发django信号,通知对象已“过期”,然后在信号处理程序中将该值设置为finished。尽管如此,这似乎有点开销,我认为必须有一个更直接的方法来做到这一点


先谢谢你

不一定重量轻,但当我面对这个问题时,我有两种解决方案

首先,我编写了一个Django管理器,它将创建一个“待过期”对象的查询集,然后删除它们。为了使这更轻松,我在自己的表中保留了与实际对象具有一对一关系的“在事件发生时过期”对象,并删除了这些事件—它们这样做是为了使该表保持较小。“tobeexpired”对象和标记为“expired”的对象之间的关系只会在取消引用ForeignKey字段时在第二个表上导致数据库命中,因此它是相当轻量级的。然后,我会使用cron(如果您不熟悉Unix,那么Unix的调度管理器)每5分钟调用一次管理调用。每隔一个小时左右的超时时间,这很好

对于更接近第二次超时的情况,我的解决方案是运行一个单独的服务器,通过Django应用程序的REST调用接收超时通知。它保存超时发生时间的排序列表,然后调用前面提到的管理调用。它基本上是一个自己的调度器,由Django进程向其提供预定事件。为了降低成本,我使用Node.js编写了它


这两种方法都奏效了。cron作业要简单得多。

如果状态在过期之前始终处于活动状态,并且在过期之后始终处于完成状态,则只需一个“完成”日期时间字段就更简单了。过去有日期时间的一切都将完成,未来的一切都将活跃。除非您的问题中没有提到某些复杂的情况,否则它应该提供您想要的功能,而无需任何计划

例如:

class TaskManager(models.Manager):
    def finished(self):
        return self.filter(finish__lte=datetime.datetime.now())

    def active(self):
        return self.filter(finish__gt=datetime.datetime.now())

class Task(models.Model):
    finish = models.DateTimeField()

    def is_finished(self):
        return self.finish <= datetime.datetime.now()
类任务管理器(models.Manager):
def完成(自我):
返回self.filter(finish\u lte=datetime.datetime.now())
def激活(自):
返回self.filter(finish\u gt=datetime.datetime.now())
课堂任务(models.Model):
finish=models.DateTimeField()
def已完成(自):

返回self.finish谢谢您的解决方案。尽管如此,第一种方法比我完成这项特定任务所需的精度稍低,而第二种方法的开销似乎比我最初的芹菜方法略高。是的,你说得对,但确实有一些额外的功能需要安排(即,我使用comet服务器通知活动用户会话对象已过期)。事实上,我最终使用了芹菜实现,我对它的工作方式和引入的复杂性感到非常满意(实际上还不算太糟).我还喜欢这样一个事实,即对我的体系结构的影响是最小的,因为它允许我使用django信号保持它的松散耦合,并将所有芹菜类的东西保留在一个单独的模块中。