[英]Problem with Lists and Queue.Queue Python 3
我在一个应用程序中工作,我必须从流(串行端口)接收数据并绘制它。 我有两个三个线程,主线程,串行读取线程和一个线程,我将用它来刷新图 @ 10 到 30 hz。
由于接收数据的速度比 30hz 快,我想将接收到的数据放入队列中,以便在绘图刷新线程必须刷新时可以获取所有新数据并绘制它。
问题是我收到的数据,一个包含十个值的列表,每个数据信号一个,我用 q.put(data) 把它放在我的队列中,但是当我在复习线程中执行 q.get() 时,我可以只读取我放入队列的最后一个值,而不是之前的值。
所以我模拟传入的流每 100 毫秒发送一次数据,刷新为 1 秒。
假设我输入的数据是:
[1,1,1,1,1,1]
[2,2,2,2,2,2] ...
[10,10,10,10,10,10]
当我在刷新线程的队列中获取数据时
while not self.q.empty():
print(q.get())
我得到10次:
[10,10,10,10,10,10]
所以就像它确实保存了最后一个值,但是对于所有的放置操作。
当我尝试使用整数而不是列表时,它按预期工作。
我也尝试将列表封装在一个类中,但是当我在类中读取列表时,我得到了相同的结果。
测试示例:
import queue
from threading import Thread
import time
class PlotsManager(object):
def __init__(self):
simulator = Simulator(self)
simulator.startSimulator()
self.samplesQueue = queue.Queue()
thread = Thread(target=self.plotSamples)
thread.start()
def putSamples(self, samples): #Puts the samples in the queue
print("Samples in: {}".format(samples))
self.samplesQueue.put(samples)
def plotSamples(self): #Pops the samples from the queue
while (1):
time.sleep(1)
while not self.samplesQueue.empty():
lastSamples = self.samplesQueue.get()
print("Samples out: {}".format(lastSamples))
class Simulator():
def __init__(self, PlotsManager):
self.plotManager = PlotsManager
def simulateNewData(self):
counter = 0
samples = [None] * 5
while (True):
# counter += 0.4
counter += 1
if counter > 100:
counter = 0
time.sleep(0.1)
for i in range(5):
samples[i] = counter
self.plotManager.putSamples(samples)
def startSimulator(self):
thread = Thread(target=self.simulateNewData)
thread.start()
if __name__ == "__main__":
pm = PlotsManager()
输出:
Samples in: [1, 1, 1, 1, 1]
Samples in: [2, 2, 2, 2, 2]
Samples in: [3, 3, 3, 3, 3]
Samples in: [4, 4, 4, 4, 4]
Samples in: [5, 5, 5, 5, 5]
Samples in: [6, 6, 6, 6, 6]
Samples in: [7, 7, 7, 7, 7]
Samples in: [8, 8, 8, 8, 8]
Samples in: [9, 9, 9, 9, 9]
Samples out: [9, 9, 9, 9, 9]
Samples out: [9, 9, 9, 9, 9]
Samples out: [9, 9, 9, 9, 9]
Samples out: [9, 9, 9, 9, 9]
Samples out: [9, 9, 9, 9, 9]
Samples out: [9, 9, 9, 9, 9]
Samples out: [9, 9, 9, 9, 9]
Samples out: [9, 9, 9, 9, 9]
Samples out: [9, 9, 9, 9, 9]
Samples in: [10, 10, 10, 10, 10]
Samples out: [10, 10, 10, 10, 10]
Samples in: [11, 11, 11, 11, 11]
Samples in: [12, 12, 12, 12, 12]
Samples in: [13, 13, 13, 13, 13]
Samples in: [14, 14, 14, 14, 14]
Samples in: [15, 15, 15, 15, 15]
Samples in: [16, 16, 16, 16, 16]
Samples in: [17, 17, 17, 17, 17]
Samples in: [18, 18, 18, 18, 18]
Samples in: [19, 19, 19, 19, 19]
Samples out: [19, 19, 19, 19, 19]
Samples out: [19, 19, 19, 19, 19]
Samples out: [19, 19, 19, 19, 19]
Samples out: [19, 19, 19, 19, 19]
Samples out: [19, 19, 19, 19, 19]
Samples out: [19, 19, 19, 19, 19]
Samples out: [19, 19, 19, 19, 19]
Samples out: [19, 19, 19, 19, 19]
Samples out: [19, 19, 19, 19, 19]
如果它被一个数字而不是一个样本列表改变,它会按预期工作。
基本上是使用 deepcopy 的解决方案。
putSamples(copy.deepcopy(samples))
据我了解,这是由于列表作为参考而不是作为值传递的事实,所以我多次向队列添加相同的值。 使用 deepcopy 时,我实际上是在每次向队列添加值时将实际值复制到队列中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.