Python: 最佳实践杀死一个循环线程

12 浏览
0 Comments

Python: 最佳实践杀死一个循环线程

我正在使用WxPython来展示给用户一种GUI形式。我有一个开关按钮,它执行grep命令,并返回每n秒的行数。

如果我在窗口内部执行这个循环,窗口就会变得无响应,用户无法再切换按钮。所以当我搜索如何防止这种情况发生时,常见的做法似乎是使用线程。但是,我遇到了这样的引用:“通常情况下,突然终止线程被认为是一种糟糕的编程实践。”,而这正是我希望我的用户能够做到的..!

所以如果我不应该在线程完成之前停止线程,那么最佳实践是什么?

这是我目前的代码:

def run(stop): 
    while True: 
        print('线程正在运行') 
        time.sleep(2)
        if stop(): 
            break
class Window(TLM_lite_GUI.MainFrame):
    def __init__(self,parent):
        TLM_lite_GUI.MainFrame.__init__(self,parent)
    def ExitEvent(self,event): 
        self.Destroy()
    def OnOffEvent(self,event):
        OnOff = self.OnOffButton.GetValue()
        t1 = threading.Thread(target = run, args =(lambda : stop_threads, )) 
        if OnOff:
            stop_threads = False
            t1.start() 
        else:
            stop_threads = True
            t1.join()
app = wx.App(False)
Frame = Window(None)
Frame.Show(True)
app.MainLoop()

这对于启动线程是有效的(我的GUI没有“挂起”),但是当我切换开关关闭时,我会得到错误:

File "C:\Python36\lib\threading.py", line 1051, in join
    raise RuntimeError("cannot join thread before it is started")
RuntimeError: cannot join thread before it is started

然后线程继续执行..我认为我的停止函数无法调用已经启动的线程或其他原因。但是,我应该使用线程来完成这个任务,还是应该用其他方法呢?

提前感谢。

0