Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查python队列中的项目_Python_Queue - Fatal编程技术网

检查python队列中的项目

检查python队列中的项目,python,queue,Python,Queue,是否可以在Python中检查队列中的项目而不调用.get()?根据文档,队列中不允许索引。我需要检查队列头部的项目是否满足某些条件,如果满足,则将其从队列中移除。同样,我需要检查队列中是否有任何其他项满足类似条件,并将其删除 我在这里使用了错误的数据结构吗 queue_object.queue将返回deque对象中队列的副本,然后您可以使用该对象的切片。当然,它不会与原始队列同步,但允许您在复制时查看队列 有一个很好的理由解释为什么你不想这样做,并在这篇文章中详细解释。但如果您只是想了解队列是如

是否可以在Python中检查
队列中的项目而不调用
.get()
?根据文档,队列中不允许索引。我需要检查队列头部的项目是否满足某些条件,如果满足,则将其从队列中移除。同样,我需要检查队列中是否有任何其他项满足类似条件,并将其删除


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

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

有一个很好的理由解释为什么你不想这样做,并在这篇文章中详细解释。但如果您只是想了解队列是如何工作的,这是一种简单的方法

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'
队列
模块实现了多生产者、多消费者队列。当信息必须在多个线程之间安全地交换时,它在线程编程中特别有用


如您所见,
队列
模块是专门为线程创建的,只提供FIFO、LIFO和优先级队列,而这些队列都不提供此功能。但是,通过检查
队列
模块的功能,您可以看到它只使用了一个(双端队列),可以轻松完成任务。您可以在固定时间内索引第一项(
[0]
)和
.popleft()

仅访问基础队列是不安全的。

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

这样做的结果是,当您迭代它时,它可能会更改—如果在迭代过程中另一个线程插入到队列中,则会导致异常

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

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

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

该类可以安全地代替常规队列使用,并且它将返回队列状态的快照。。。在互斥锁内,并且不会在基础队列操作中引起问题。

听起来你应该使用a,而不是,你在使用线程吗?不,我没有使用线程-1 OP应该单独使用
deque
,这是一种不好的方法。而你-1告诉我,因为我正确回答了他的问题。。那真是太粗鲁了。您没有考虑到他可能正在使用需要队列互斥体的现有代码,他只是试图了解它是如何工作的——根本不需要观察队列。我的正确答案与stackoverflow的精神背道而驰,也与帮助他人的努力背道而驰。问题是:“是否可以在python中检查队列中的项目而不调用get()?”。对它是。我解释了怎么做。对于OP,他可以切换到deque,这很好,其他拥有已建立代码库的人可能无法。虽然
queue
对象的
.queue
属性没有前导的
\ucode>表示它是私有的,但它没有文档,所以我不愿意使用它。我不会否决你的答案,但我认为这不是一个好建议。@jamylak你们都是对的。stackoverflow有一个严重的问题,不清楚答案应该是迂腐的(“你的问题意味着你做错了”)还是务实的(“这是你如何做你要求做的不安全的事情”)。正确的建议是:始终同时做这两件事。1.给出不安全的方法和2。解释为什么不应该使用它。在回答问题时,你不知道为什么有人问他们。为了避免误解,也许你应该(为其他读者)提到
队列
有一个
self.mutex=\u threading.Lock()
,而不是
deque
s,因此,在多线程环境中,使用后一种方法而不是前一种方法是不等价的,这在这里不是这样的,因为OP提到没有使用线程作为注释。nit:with行中缺少冒号。但这是一个很好的答案。