如何使用django models / database实现队列?

时间:2016-01-28 05:56:22

标签: python django

我想在我的Django应用程序中实现一个队列,并以模型为基础。我应该能够排队到队列的前面,并根据记录的创建时间或队列记录将队列后端的旧项目以某种方式从队列中出列,以便您知道哪个记录首先排队,然后排队等等。实现这个的最佳方法是什么?

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

以前曾提出过类似的问题,但我的要求不同。我不需要像celery那样的任务队列/作业队列。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

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

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这样的消息代理。