【问题标题】:Discarding FIFO queue, with max capacity, in Python?在Python中丢弃具有最大容量的FIFO队列?
【发布时间】:2013-08-24 20:57:47
【问题描述】:

我需要一个丢弃 FIFO 队列,它会在满时自动丢弃项目。 它不必是线程安全的。效率更重要。

也就是说,我需要从设备中采样信号,同时能够以半随机时间检索最后 n 秒(对象)。

我自己实现了一个(不是那么线程安全的)缓冲区,但感觉我在这里重新发明了轮子。此外,我们正在谈论每秒 100 个对象。大多数将被丢弃,例如一次必须检索 3000 个(= 30 秒的数据)(比如每十分钟一次)。

Python 标准库或其他地方是否已经有这样的类?我使用了一些 goggle-fu,但没有找到任何有用的东西。

丢弃缓冲区

from Queue import Queue, Full, Empty
import logging


class DiscardingBuffer():
    def __init__(self, capacity=0):
        self._queue = Queue(maxsize=capacity)

    def put(self, item):
        while True:
            try:
                self._queue.put(item, block=False)
                logging.debug('Put item: {0}'.format(item))
                break
            except Full:
                discarded_item = self._queue.get(block=False)
                logging.debug('Buffer is full. Discarding: {0}'.format(discarded_item))

    def flush(self):
        items = []

        while True:
            try:
                items.append(self._queue.get(block=False))
            except Empty:
                logging.debug('Buffer is now empty.')
                break

        return items


def main():
    buf = DiscardingBuffer(5)

    for i in xrange(10):
        buf.put(i)

    logging.debug('Remaining items: {0}'.format(buf.flush()))
    logging.debug('Verify it is empty: {0}'.format(buf.flush()))


if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG,
                        format='[%(levelname)1.1s %(asctime)s %(name)s (%(process)d):%(lineno)d] %(message)s',
                        datefmt='%Y-%m-%d %H:%M:%S')
    main()

输出

[D 2013-08-22 10:13:58 root (4164):13] Put item: 0
[D 2013-08-22 10:13:58 root (4164):13] Put item: 1
[D 2013-08-22 10:13:58 root (4164):13] Put item: 2
[D 2013-08-22 10:13:58 root (4164):13] Put item: 3
[D 2013-08-22 10:13:58 root (4164):13] Put item: 4
[D 2013-08-22 10:13:58 root (4164):17] Buffer is full. Discarding: 0
[D 2013-08-22 10:13:58 root (4164):13] Put item: 5
[D 2013-08-22 10:13:58 root (4164):17] Buffer is full. Discarding: 1
[D 2013-08-22 10:13:58 root (4164):13] Put item: 6
[D 2013-08-22 10:13:58 root (4164):17] Buffer is full. Discarding: 2
[D 2013-08-22 10:13:58 root (4164):13] Put item: 7
[D 2013-08-22 10:13:58 root (4164):17] Buffer is full. Discarding: 3
[D 2013-08-22 10:13:58 root (4164):13] Put item: 8
[D 2013-08-22 10:13:58 root (4164):17] Buffer is full. Discarding: 4
[D 2013-08-22 10:13:58 root (4164):13] Put item: 9
[D 2013-08-22 10:13:58 root (4164):26] Buffer is now empty.
[D 2013-08-22 10:13:58 root (4164):38] Remaining items: [5, 6, 7, 8, 9]
[D 2013-08-22 10:13:58 root (4164):26] Buffer is now empty.
[D 2013-08-22 10:13:58 root (4164):39] Verify it is empty: []

【问题讨论】:

    标签: python python-2.7 queue fifo


    【解决方案1】:

    使用collections.deque 指定maxlen

    >>> q = deque(maxlen=2)
    >>> q.extend([1, 2, 3])
    >>> q
    deque([2, 3], maxlen=2)
    

    【讨论】:

    • 这正是我所需要的。太感谢了! Python 标准库真的很棒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多