2016-01-28 32 views
3

我想在我的Django應用中使用模型實現隊列,因爲它是基礎。我應該能夠排隊到隊列的前面,並根據記錄的創建時間從隊列後面出列舊隊列,或者以某種方式將鏈接記錄彼此鏈接起來,以便知道哪個記錄首先排隊,然後依次排隊等等。什麼是實施這個最好的方法?如何用django模型/數據庫實現隊列?

模型中有created = models.DateTimeField()字段並掃描記錄以查找最早的記錄並將其出列/ delete()它是否是一個好主意?這樣你會在表演中妥協多少?或者有沒有更好的方法來鏈接隊列項目以知道他們入隊的順序?

以前也有類似的問題,但我的要求不同。我不需要像芹菜促進的任務隊列/作業隊列。

預先感謝您。

+1

如果你想在你的模型上進行簡單的排序,你可以在模型的Meta類中添加一個像'created = models.DateTimeField(auto_now_add = True)'加上'ordering =('created',)'的字段。然後你可以使用'model.objects.first()'和'model.objects.last()'來獲得第一個和最後一個,並做你需要做的事情。根據將要使用的操作的多少,從性能的角度來看,使用Celery或其他任務隊列可能更好 - 這就是任務隊列的目的。 – ChidG

回答

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等消息代理。