检查python队列中的项目

时间:2013-05-22 07:49:45

标签: python queue

是否可以在不调用Queue的情况下检查Python中.get()中的项目?根据文档,Queue中不允许编制索引。我需要检查队列头部的项是否满足某些条件,如果是,请将其从队列中删除。类似地,我需要检查队列中的任何其他项是否满足相似条件并将其删除。

我在这里使用了错误的数据结构吗?

3 个答案:

答案 0 :(得分:13)

queue_object.queue将在deque对象中返回队列的副本,然后您可以使用切片。当然,它不与原始队列同步,但允许您在复制时查看队列。

有一个很好的合理化,为什么你不想在这个帖子comp.lang.python - Queue peek?中详细解释这个问题。但如果您只是想了解Queue的工作原理,这是一种简单的方法。

import Queue
q = Queue.Queue()
q.push(1)
q.put('foo')
q.put('bar')
d = q.queue
print(d)
deque(['foo', 'bar'])
print(d[0])
'foo'

答案 1 :(得分:3)

  

Queue模块实现多生产者,多消费者队列。当必须在多个线程之间安全地交换信息时,它在线程编程中特别有用。

如您所见,Queue模块专门为线程使用而创建,仅提供 FIFO LIFO 优先级队列,其中没有一个提供此功能。但是,通过检查Queue模块的source code,您可以看到它只使用collections.deque(双端队列),可以轻松完成您的任务。您可以在固定时间内为第一项([0])和.popleft()编制索引。

答案 2 :(得分:0)

仅访问基础队列并不安全。

安全的方法是扩展Queue类。如果返回基础出队对象,则不会获得副本,您将获得活动对象

其结果是它可以在迭代时更改-如果在迭代过程中另一个线程插入队列,则会导致异常。

知道python使用GIL后,您可以放心使用list(q.queue),因为list()永远不会引起上下文切换。

最好使用与get()函数相同的锁,而不要对GIL进行假设:

import queue
    
class SnapshotQueue(queue.Queue):
    def snapshot(self):
        with self.mutex
            return list(self.queue)

可以安全地使用该类而不是常规队列,并且该类将在互斥对象内返回队列状态的快照,而不会导致基础队列操作出现问题。