是否可以在不调用Queue
的情况下检查Python中.get()
中的项目?根据文档,Queue中不允许编制索引。我需要检查队列头部的项是否满足某些条件,如果是,请将其从队列中删除。类似地,我需要检查队列中的任何其他项是否满足相似条件并将其删除。
我在这里使用了错误的数据结构吗?
答案 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)
可以安全地使用该类而不是常规队列,并且该类将在互斥对象内返回队列状态的快照,而不会导致基础队列操作出现问题。