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 行队列后。
Queue
s 不会在达到最大尺寸时逐出条目,当您尝试 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)
。
我正在编写一个脚本,该脚本使用队列来跟踪长度为 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 行队列后。
Queue
s 不会在达到最大尺寸时逐出条目,当您尝试 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)
。