Проблема со списками и очередью. Очередь Python 3 - PullRequest
0 голосов
/ 09 февраля 2020

Я работаю в приложении, где мне нужно получить данные из потока (последовательный порт) и построить их. У меня есть два, три потока: основной поток, поток последовательного чтения и поток, который я буду использовать для рефракции sh графиков с 10 до 30 Гц.

Поскольку данные принимаются быстрее, чем 30 Гц, я хотите поместить полученные данные в очередь, чтобы при обновлении графика потоком sh можно было взять все новые данные и построить их.

Проблема в том, что полученные данные представляют собой список с десять значений по одному для каждого сигнала данных, я помещаю его в свою очередь с помощью 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 ]

Так нравится сохраняет последнее значение, но для всех операций put.

Когда я пытаюсь использовать целое число вместо списка, оно работает как положено.

Я также пытался инкапсулировать список в классе, но когда Я читаю список внутри класса и получаю тот же результат.

Пример для проверки:

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]

Если он изменяется на число вместо списка образцов работает как положено.

1 Ответ

0 голосов
/ 15 февраля 2020

хорошо в основном решение для использования глубокой копии.

putSamples (copy.deepcopy (samples))

Насколько я понимаю, это связано с тем, что список передается как ссылка, а не как значение, поэтому я добавляю то же самое значение в очередь много раз. С помощью глубокого копирования я фактически копирую фактическое значение в очередь каждый раз, когда добавляю значение в очередь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...