python线程终止线程
通过线程终止线程
本文偏向于个人总结而非技术总结,文中方法可以当做一种参考,但一定不唯一!
背景介绍
我主要编写单线程python脚本,对于多线程知之甚少。我以为单线程的好处在于快、并且在哪里出错程序马上就会停下来,所以个人对于单线程还是颇为偏向的(一定不是因为我不会多线程!!)。直到某天我遇到了模拟键鼠操作的需求,需要根据excel中的内容去一个点击一个界面,并且将结果返回excel中,这个需求难以对做出的操作进行判断,也就是说假如你的电脑突然弹出了一个广告?弹窗?这些都可能诱发未知的错误。并且无法判断操作,就意味着他不会因为报错而停止,而是接着往下跑,可能导致接下的操作全部变形,那么此时就需要通过外界力量来干涉程序使其停下。
结构
GUI---按扭----按钮启动主程序
思路
点击按钮启动主程序的同时开启事件监听程序,当监听到某一键盘按键时终止程序。
但是线程似乎并不能直接结束另一线程。
那么似乎只能直接关闭python了。
开始尝试
启动程序,打开任务管理器,发现程序在后台是这种结构。
xxx(打包出来的exe名)- xxxx(gui标题)
尝试1
两个代码都是通过窗口的按钮启动,那么可否通过关闭窗口来终止线程呢?
def on_release(self, key):
print("已经释放:", format(key))
if key == Key.esc:
self.kill_name('xxxx')
sys.exit()
def kill_name(self, name):
pids = psutil.pids()
for pid in pids:
p = psutil.Process(pid)
if p.name() == name:
cmd = r'taskkill /F /IM ' + name
os.system(cmd)
def start_listen(self):
Listener(on_release=self.on_release).start()
def listening(self):
self.start_listen()
答案是不行的,当我尝试关闭窗口时,窗口会变成xxxx(未响应),而主程序则是继续运行,猜测是因为主程序未关闭,所以导致窗口也无法关闭。
尝试2(√)
在打包exe时附带cmd窗口,监听事件关闭cmd窗口已达到停止程序的目的,经实践可行。
但是太丑了,所以方案被淘汰。
尝试3以及新的问题以及解决(√)
直接关闭xxx(打包出的exe),经实践证明可行。
但是又出现了新的问题,我根据要求增加了操作,在退出程序的时候将我在后台打开的东西都给关闭了,不留下垃圾,但是由于是直接关闭,excel的数据自然是没有保存的。当我尝试将excel设为全局变量,在监听时先保存excel在关闭时,又报了一个新的错误。
他说我的excel被另一线程(主程序)占用了无法操作 ,也就是说我只能在主程序中对excel进行保存与退出的操作,那我瞬时就想到了一个方法,那就是设计一个全局变量作为标记值,然后在主程序设置多个checkpoint,监听事件会更改标记值,当check到标记值改变的时候对excel进行保存退出,以及退出程序的操作。
缺点很明显了,
(一)在主程序中加入大量的if判断很显然会影响到效率
(二)代码观赏性降低了
(三)更改代码的时候挺痛苦的,隔几行就要插入一次判断函数
更多推荐
所有评论(0)