如何在Django中创建对象队列?

2024-06-08 22:29:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Django的新手,我正试图自己建立一个博客。我正在尝试创建一个在Drupal中使用nodequeue模块实现的特性。在

我想做的是能够创建对象队列,例如,blog posts队列。下面,我将描述我如何想象排队工作:

  • 每个队列的大小应该是用户定义的。在
  • 应记录对象添加到队列的日期。在
  • 我希望能够定义属于每个队列的项目的顺序(但我认为这将非常困难)。在
  • 如果队列已满,则添加额外项时应丢弃队列中最旧的项。在

创建一个特色帖子队列就是这样一个功能如何有用的例子。在

我目前的知识还不足以让我想出正确的方法。我会很感激你的指点。在

提前谢谢


Tags: 模块django用户定义队列blog特性排队
3条回答

亚历克斯的方法很好。我不会假装与他的专业水平竞争,但为了完整起见,这里有另一种使用奇妙的^{}类的方法(好处是:线程安全,但根据您的描述,这有点没用)。这对你来说可能更容易理解,因为你在这一点上表达了一些担忧:

在我的队列.py

#!/usr/bin/python

# Renamed in Python 3.0
try: from Queue import Queue, Full, Empty
except: from queue import Queue, Full, Empty
from datetime import datetime

# Spec 1: Size of each queue should be user-defined.
#   - maxsize on __init__

# Spec 2: Date an object is added should be recorded.
#   - datetime.now() is first member of tuple, data is second

# Spec 3: I would like to be able to define the order of the items that
# belong to each queue.
#   - Order cannot be rearranged with this queue.

# Spec 4: If the queue is full, the addition of an extra item should discard
# the oldest item of the queue.
#   - implemented in put()

class MyQueue(Queue):
    "Wrapper around Queue that discards old items instead of blocking."
    def __init__(self, maxsize=10):
        assert type(maxsize) is int, "maxsize should be an integer"
        Queue.__init__(self, maxsize)

    def put(self, item):
        "Put an item into the queue, possibly discarding an old item."
        try:
            Queue.put(self, (datetime.now(), item), False)
        except Full:
            # If we're full, pop an item off and add on the end.
            Queue.get(self, False)
            Queue.put(self, (datetime.now(), item), False)

    def put_nowait(self, item):
        "Put an item into the queue, possibly discarding an old item."
        self.put(item)

    def get(self):
        "Get a tuple containing an item and the datetime it was entered."
        try:
            return Queue.get(self, False)
        except Empty:
            return None

    def get_nowait(self):
        "Get a tuple containing an item and the datetime it was entered."
        return self.get()


def main():
    "Simple test method, showing at least spec #4 working."
    queue = MyQueue(5)
    for i in range(1, 7):
        queue.put("Test item number %u" % i)

    while not queue.empty():
        time_and_data = queue.get()
        print "%s => %s" % time_and_data


if __name__ == "__main__":
    main()

预期输出

^{pr2}$

您可以使用django活动流。它不像Nodequeue那样有UI,但可以用来创建不同的对象队列。在

有一种方法:

import collections, datetime, itertools

class nodequeue(object):
  def __init__(self, N):
    self.data = collections.deque(N * [(None, None)])
  def add(self, anobj):
    self.data.popleft()
    self.data.push((anobj, datetime.datetime.now())
  def __iter__(self):
    it = iter(self.data)
    return it.dropwhile(lambda x: x[1] is None, self.data)

我也不想再加上“命令”这句话

^{pr2}$

我认为用占位符Nones作为队列的前缀可以简化代码,因为add在添加新内容之前总是删除最左边的(最旧的或没有的)项,即使__iter__必须删除占位符,这并不太糟糕。在

相关问题 更多 >