Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.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
Python 如何使用django模型/数据库实现队列?_Python_Django - Fatal编程技术网

Python 如何使用django模型/数据库实现队列?

Python 如何使用django模型/数据库实现队列?,python,django,Python,Django,我想在Django应用程序中实现一个以模型为基础的队列。我应该能够排队到队列的前面,并根据记录的创建时间从队列的后面将旧项目排出来,或者以某种方式将记录链接到彼此,这样您就可以知道哪个记录先排队,哪个记录下一个排队,依此类推。实现这一点的最佳方式是什么 在模型中创建一个created=models.DateTimeField()字段,并扫描记录以查找最早的记录,然后将其出列/delete()?通过这种方式,您会在性能上妥协多少?或者,有没有更好的方法链接队列项目以了解它们的排队顺序 以前也有人问

我想在Django应用程序中实现一个以模型为基础的队列。我应该能够排队到队列的前面,并根据记录的创建时间从队列的后面将旧项目排出来,或者以某种方式将记录链接到彼此,这样您就可以知道哪个记录先排队,哪个记录下一个排队,依此类推。实现这一点的最佳方式是什么

在模型中创建一个
created=models.DateTimeField()
字段,并扫描记录以查找最早的记录,然后将其出列/
delete()
?通过这种方式,您会在性能上妥协多少?或者,有没有更好的方法链接队列项目以了解它们的排队顺序

以前也有人问过类似的问题,但我的要求不同。我不需要像芹菜那样的任务队列/作业队列


提前感谢您。

在您有多个并发连接之前,您的方式很好。例如,您可以提出如下内容:

class Message(models.Model):
    created = models.DateTimeField(auto_now_add=True, db_index=True)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerKey(db_index=True)
    content_object = GenericForeignKey('content_type', 'object_id')

class MessageQuerySet(models.QuerySet):
    def dequeue(self, count):
        items = (self.order_by('-created')
                 .select_related('content_object')
                 .values('content_object'))
        self.filter(pk__in=items).delete()
        return [item['content_object'] for item in items]


stack = Message.objects.dequeue(3)

如果有许多不同的进程访问堆,那么麻烦就开始了。很有可能,当您尝试将某些项目出列时,另一个进程会将一个项目置于顶部。在这种情况下,唯一正确的解决方案是使用RabbitMQ或ZeroMQ之类的消息代理。

如果您希望在模型上进行简单排序,可以添加一个类似
created=models.datetime字段(auto\u now\u add=True)
的字段,然后将
ordering=('created',)
添加到模型的元类中。然后,您可以使用
model.objects.first()
model.objects.last()
获取第一个和最后一个对象,并对它们执行所需的操作。根据使用量的不同,从性能的角度来看,使用芹菜或其他任务队列可能会更好——这就是任务队列的用途。