是否可以Queue在不调用的情况下检查Python中的项目.get()?根据文档,Queue中不允许编制索引.我需要检查队列头部的项是否满足某些条件,如果是,请将其从队列中删除.类似地,我需要检查队列中的任何其他项是否满足相似条件并将其删除.
我在这里使用了错误的数据结构吗?
syn*_*tel 17
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'
Run Code Online (Sandbox Code Playgroud)
jam*_*lak 10
该
Queue模块实现了多生产者、多消费者队列。当信息必须在多个线程之间安全交换时,它在线程编程中特别有用。
如您所见,该Queue模块是专门为与线程一起使用而创建的,仅提供FIFO、LIFO和优先级队列,它们都没有提供此功能。但是通过检查源代码中的Queue模块,你可以看到,它只是使用collections.deque(双端队列),它可以轻松地完成你的任务。您可以在恒定时间内索引第一项 ( [0]) .popleft()。
简单地访问底层队列是不安全的。
安全的方法是扩展 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)
Run Code Online (Sandbox Code Playgroud)
该类可以安全地使用,而不是常规队列,并且它将在互斥锁内返回队列状态的快照,并且不会导致底层队列操作出现问题。