Python: 最佳实践杀死一个循环线程
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
然后线程继续执行..我认为我的停止函数无法调用已经启动的线程或其他原因。但是,我应该使用线程来完成这个任务,还是应该用其他方法呢?
提前感谢。