加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 13:09:48 所属栏目:Python 来源:网络整理
导读:我想在我的Django应用程序中实现一个队列,其模型是它的基础.我应该能够排队到队列的前面,并根据记录的创建时间或队列记录将队列后端的旧项目以某种方式从队列中出列,以便您知道哪个记录首先排队,然后排队等等.实现这个的最佳方法是什么? 在模型中有一个crea
我想在我的Django应用程序中实现一个队列,其模型是它的基础.我应该能够排队到队列的前面,并根据记录的创建时间或队列记录将队列后端的旧项目以某种方式从队列中出列,以便您知道哪个记录首先排队,然后排队等等.实现这个的最佳方法是什么?

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

之前已经提出了类似的问题,但我的要求是不同的.我不需要像celery那样的任务队列/作业队列.

先感谢您.

解决方法

在你有很多并发连接之前,你的方式很好.例如,你可以想出类似的东西:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读