【问题标题】:python - How to view Entire Queue Contents & Automatic Queue Pushoutpython - 如何查看整个队列内容和自动队列推送
【发布时间】:2015-09-29 13:40:41
【问题描述】:

我正在编写一个脚本,它使用队列来跟踪长度为 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]

但是,此脚本永远不会停止运行。它冻结了,我必须使用 ctrl+break 打破。所以经过深思熟虑,我弄清楚了它冻结的原因。它冻结是因为当我将数据“放入” 到队列中时,它不会自动将旧数据推送到队列的另一端。所以我猜队列被卡住了。我错过了什么吗,这不是队列工作的重点吗?我必须调用“get”吗?无论如何都必须为队列调用另一个函数,当新数据被推入队列时它会自动推出最旧的数据?

我的第二个问题:

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

print my_queue

结果:

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

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

【问题讨论】:

    标签: python python-2.7 queue


    【解决方案1】:

    Queues 不会在条目达到最大大小时驱逐条目,当您尝试 put 时,它们会阻止超过最大大小的条目(这就是您的程序停止的原因)。它们是为原子间线程通信而设计的,因此查看它们的内容不是设计目标,而是以线程安全的方式允许get-ing 和put-ing(在适当的情况下进行阻塞)。

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

    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 一样没有 kruft,请将 print 更改为 print list(last_6_data_points)

    【讨论】:

    • 这将为未填写的条目打印None,而不是null,但我假设没关系。如果需要,您可以将其更改为str"null"(尽管它会在其周围加上引号);如果这不可接受,您需要自己格式化输出,而不是依靠 list repr 为您完成。
    • null 是伪代码。我会仔细看看你的代码。谢谢。
    • @budder:好的。通常,我会省略初始化程序而只使用maxlen,因为填充条目并不能真正为您带来任何好处,但您的示例显示了填充,所以我提供了它。如果不需要填充,只需初始化:last_6_data_points = deque(maxlen=6)
    • 查看了您的代码。它工作得很好,但是我会做一个修改。最终我需要访问 last_6_data_points,因此,我想要实际的数据列表:list(last_6_data_points)。
    • @budder:您可以访问来自last_6_data_points 的值,而无需转换为listdeques 迭代与list 相同,for item in mydeque:for item in mylist: 工作相同(因为它们都是序列)。由于deque 很短,它甚至没有通常与deques 相关的负数(deque 中间附近的索引是线性访问时间),因此您可以根据需要对其进行索引,@ 987654352@ 简称为deque 就可以了。转换回list 也不错,只是没有必要访问数据; deques 提供完全访问权限。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    相关资源
    最近更新 更多