Python多线程队列保持“空”

时间:2019-07-18 15:55:15

标签: python multithreading serial-port

我有一个正在构建的python应用程序,用于运行一些测试,其中涉及使用Null Modem USB-to-USB(当前使用PC上的仿真器)将串行数据从一个USB端口发送到另一个USB端口。 我编写了一个串行侦听器,如下所示:

import serial
import threading
from queue import Queue

class SerialPort(object):
    def ___init__(self, timeout=None):
        self.ser = serial.Serial(baud=_, stopbits=_, ... timeout=timeout)
        self.out_q = Queue()
        self.in_q = Queue()
        self.THREAD = None

    def setup(self, com):
        self.ser.port = com
        self.ser.open()        

    def run(self):
        self.THREAD = threading.Thread(target=self.listen, args=(self.out_q, self.in_q,))
        self.THREAD.start()

    def listen(self, in_q, out_q):
        while True:
            if not in_q.empty():
                # This code is never reached, even though it should be
                message = in_q.get()
                if message == 'DIE':
                    break
                else:
                    self.ser.write(message)

    def send_command(self, command):
        self.in_q.put(command)


class GUI(object):
    def __init__(self):
        self.POWER = False
        self.server_port = SerialPort(timeout=0.1)
        self.client_port = SerialPort(timeout=0.1)
        #etc etc Tkinter stuff and things

    def on_power_button_click(self):
        # Tkinter Button already made, know the button works as expected
        self.POWER = not self.POWER
        if self.POWER:
            self.server_port.setup('COM5')
            self.client_port.setup('COM6')
            self.server_port.run()
            self.client_port.run()
        else:
            self.server_port.send_command('DIE')
            self.client_port.send_command('DIE')
            time.sleep(0.3)
            self.server_port.ser.close()
            self.client_port.ser.close()

my_example_problem = GUI()
# Creates threads and 'turns on' the application
my_example_problem.on_power_button_click()
# Should Turn off the application but doesn't
my_example_problem.on_power_button_click()

一切正常,但是每当它们关闭时,“ DIE”命令就永远不会在listen()中注册,而in_q.empty()被卡为False,我不知道为什么。我想知道这是否可能是一个范围问题,但是我有另一个应用程序,它使用完全相同的范围编写,但仅使用一个线程并且工作正常,并且据我了解,Python队列的工作方式与带有指向起始内存块的指针,因此作用域无关紧要。

1 个答案:

答案 0 :(得分:0)

问题是您的目标函数listen具有签名..., in_q, out_q接受输入队列 首先,然后接受输出队列-但是Thread(在run()函数内)的参数顺序错误:

... , args=(self.out_q, self.in_q,)

更改线程实例化的参数/队列顺序:

self.THREAD = threading.Thread(target=self.listen, args=(self.in_q, self.out_q,))