繁体   English   中英

列表和 Queue.Queue Python 3 的问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM