【问题标题】:Queue- Multi Threading Python队列 - 多线程 Python
【发布时间】:2016-09-01 14:32:10
【问题描述】:

我有一堆代码,我在这里附上一段。基本上我有一个线程 - 它针对一个函数 - 有一个 while 循环如下:

while not stop_event.wait(1): # Continuous Reading Function

    #print "hello2"
    #print ("working on %s" % arg)
    data1 = Read(soa1, bytes1, ser)
    data2 = Read(soa2, bytes2, ser)
    data3 = Read(soa3, bytes3, ser)

    data = np.concatenate([data1, data2, data3])
    print data.size
    queue_read.put(data)
    time.sleep(1)

我正在通过此线程中的串行通信从 MCU 读取数据并将其发送回我的主程序 - 使用 queue_read.put(data)。此 while 每 1 秒运行一次。

在我的主程序中,我将该线程的输出读取为 ---

self.data = queue_read.get()

五分钟后,MCU 中的值被有意更改。在更改期间,此线程仍在运行,因为它处于 while 循环中。

所以五分钟后,变量“数据”应该有来自 MCU 的更新的新值。但令我惊讶的是,事实并非如此。它仍然具有初始值。我在这里有什么遗漏吗?使用队列是获取数据的正确方法吗?

【问题讨论】:

  • Queue 是生产者/消费者线程的理想选择。但我们需要查看 OP 中的 enter code here 以提供帮助
  • @CraigBurgler 我编辑了这个问题。问题是 self.data 或变量“data”没有更新,因为一旦我的主程序通过代码行 self.data = queue_read.get(),它就不会再次读取。所以我想知道我应该如何能够连续地从线程中读取数据并更新我的 GUI
  • 请看我的回答

标签: python multithreading variables queue pyserial


【解决方案1】:

以下方法从队列中连续读取和处理数据,这使您可以在数据更改发生时查看和响应:

while True:
    self.data = queue_read.get()
    self.update_GUI() 

如果queue_read 为空,则queue_read.get() 阻塞。如果主线程除了更新 GUI 之外,还需要在自己的线程中运行此代码。

【讨论】: