python - 如何查看整个队列内容和自动队列推出

python - How to view Entire Queue Contents & Automatic Queue Pushout

我正在编写一个脚本,该脚本使用队列来跟踪长度为 N 的列表的最后六个数字。换句话说,当我遍历长度为 N 的列表时,我想跟踪最后六个数字。我认为队列是执行此操作的好结构,因为它会在我输入新号码时自动推出最后的第 6 个号码。我的代码如下:

if __name__ == '__main__':

    data = [1,23,45,5,43,2,54,2,34,32]
    scub = DataScrubber(data)
    scub.scrub_zeros(0.01)

    print "TEST"


def scrub_zeros(self,upperzero_range):
        scrubbed_data = [] 
        last_6_data_points = Queue.Queue(6)

        for data in self.data:
            print last_6_data_points
            print scrubbed_data
            last_6_data_points.put(data)
            scrubbed_data.append(data)  
        self.data = scrubbed_data

当我 运行 这个脚本时,我得到以下输出:

<Queue.Queue instance at 0x03E25D00>
[]
<Queue.Queue instance at 0x03E25D00>
[1]
<Queue.Queue instance at 0x03E25D00>
[1, 23]
<Queue.Queue instance at 0x03E25D00>
[1, 23, 45]
<Queue.Queue instance at 0x03E25D00>
[1, 23, 45, 5]
<Queue.Queue instance at 0x03E25D00>
[1, 23, 45, 5, 43]
<Queue.Queue instance at 0x03E25D00>
[1, 23, 45, 5, 43, 2]

但是,这个脚本永远不会停止 运行ning。它冻结了,我必须使用 ctrl+break 退出。于是想了想,想通了冻死的原因。它冻结是因为当我 "put" 数据进入队列时,它不会自动将旧数据推送到队列的另一端。所以我猜队列卡住了。我是否遗漏了什么,难道这不是队列工作的重点吗?我必须打电话给 "get" 吗?无论如何必须为队列调用另一个函数,当新数据被推入队列时它会自动推出最旧的数据?

我的第二个问题:

如何像列表一样查看整个队列?所以:

print my_queue

结果:

[null,1, 23, 45, 5, 43]

将 5 个号码推入 6 行队列后。

Queues 不会在达到最大尺寸时逐出条目,当您尝试 put 中的条目会超过其最大尺寸时,它们会阻止(这就是您的程序停滞的原因) .它们是为原子线程间通信而设计的,所以查看它们的内容不是设计目标,它是以线程安全的方式允许 get-ing 和 put-ing(在适当的时候阻塞) .

由于您没有使用具有 Queue 阻塞功能的线程间切换,您根本不需要 Queue,您需要 collections.deque maxlen.

from collections import deque

...

def scrub_zeros(self,upperzero_range):
    scrubbed_data = [] 
    last_6_data_points = deque([None]*6, maxlen=6)

    for data in self.data:
        print last_6_data_points
        print scrubbed_data
        last_6_data_points.append(data)
        scrubbed_data.append(data)  
    self.data = scrubbed_data

deque 的字符串化会显示元素,但会包含额外的 kruft;如果你想让它看起来 list-像 w/o kruft,将 print 更改为 print list(last_6_data_points)