检查python队列中的项目

dam*_*mon 13 python queue

是否可以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)

  • 你是一个我,因为我正确地回答了他的问题?..真的很粗鲁.你没有考虑到他可能正在处理需要Queue互斥量的_existing code_,而他只是试图_understand_它是如何工作的 - 完全可以观察队列.要驳回这个问题(这是一个合理的新手问题),或者-1我的正确答案与stackoverflow的精神背道而驰并试图帮助人们. (7认同)
  • 问题是:"是否可以在不调用get()的情况下检查python中队列中的项目?".是.它是.我解释了如何.对于OP而言,他可以切换到deque,其他拥有已建立代码库的人可能无法做到. (7认同)
  • @jamylak你们都是对的。stackoverflow存在一个严重的问题,目前尚不清楚答案是应该是ped琐的(“您的问题意味着您做错了事”)还是务实的(“这就是您要做的不安全的事情”)。正确的建议是:总是做到。1.给出不安全的方法,然后2.说明为什么不应该使用它。回答问题时,您不知道为什么有人问他们。 (2认同)

jam*_*lak 10

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

如您所见,该Queue模块是专门为与线程一起使用而创建的,仅提供FIFOLIFO优先级队列,它们都没有提供此功能。但是通过检查源代码中的Queue模块,你可以看到,它只是使用collections.deque(双端队列),它可以轻松地完成你的任务。您可以在恒定时间内索引第一项 ( [0]) .popleft()


Eri*_*sty 9

简单地访问底层队列是不安全的。

安全的方法是扩展 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)

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