Python终止不会返回命令行

时间:2017-05-23 16:59:12

标签: python multithreading

更新:我发现了这个错误。停止线程时,应关闭在listner中打开的串口。我不这样做。

我有一个简单的python程序,在它的主要部分,它通过调用它们的start()函数启动2个线程。当用户按下某个特定的键时,程序会清除这两个线程每次检查的条件self.is_running=false,因此它们会在错误时终止:

def run(self):
    ...
    while self.is_running:
       ...
    return

问题是我看到线程终止,但程序永远不会返回到命令提示符,并且没有组合键ctrl+x等会使它返回到命令提示符。如果我想使用终端控制台,我必须手动关闭控制台窗口并重新启动一个新窗口。我甚至在线程终止后使用sys.exit()但仍然没有区别。enter image description here

你知道我哪里出错吗?

这是最小的代码:

main.py:

def main():

    listner_thread = None
    try:
        listner_thread = listner.listner()
        listner_thread.start();        
    except:
        Message = "Listener Thread Failed To Start"
        print (Message)
        return


    ui_thread=None
    try:
        ui_thread = ui.ui(listner_thread)
        ui_thread.start();          
    except:
        Message = "UI Thread Failed To Start"
        print (Message)
        return

    return  


if __name__ == '__main__':
    main()

listener.py和ui.py threads:

class listner(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self)
        self.port=serial.serial('COM11',115200)  

    def run(self):
        ...
        while self.is_running:
            self.port.read(1) 
        return

指示终止线程的是ui线程:

ui.py

class ui(threading.Thread):

    def __init__(self,listner):
        threading.Thread.__init__(self)     
        self.listner=listner

    def run(self):
        Message = ('\n    Starting Thread (' +  self.name + ')\n')
        print Message

        self.running = True


        while self.running:
            user = raw_input('\n   Q- Quit\n')

            if user.isalpha() and user.upper() == 'Q':
                self.listner.is_running= False
                self.running = False

        return

2 个答案:

答案 0 :(得分:1)

您在UI线程实例上将running设置为False,但绝不会在侦听器线程实例上改变running。因此,您的侦听器线程将永远不会退出。

尝试将退出条件提升为全局,例如should_exit = False。然后,UI线程可以设置此True,并且由于全局范围是跨线程共享的,因此两者都应该看到更改。

答案 1 :(得分:0)

在监听器中我打开了一个串口。在线程终止时没有关闭(port.close())设置' is_running = False' ,当我添加port.close()时,它正确地退出了线程。