Python退出主进程后子线程不会退出的解决方案
Python中使用了子线程,主线程代码执行完毕后,由于子线程用了无限循环,导致主线程退出后,子线程还在运行
解决方案:
无效方案:代码结尾处增加代码
Python 全选
sys.exit()
无效方案:代码结尾处增加os._exit()
Python 全选
os._exit()
原因
Python中threading模块并没有设计线程退出的机制,原因是不正常的线程退出可能会引发意想不到的后果。
例如:
线程正在持有一个必须正确释放的关键资源,锁。
线程创建的子线程,同时也将被杀掉。
管理自己的线程,最好的处理方式是拥有一个请求退出标志,这样每个线程依据一定的时间间隔检查规则,看是不是需要退出。
例如下面的代码:
Python 全选
import threading
class StoppableThread(threading.Thread):
"""Thread class with a stop() method. The thread itself has to check
regularly for the stopped() condition."""
def __init__(self):
super(StoppableThread, self).__init__()
self._stop_event = threading.Event()
def stop(self):
self._stop_event.set()
def stopped(self):
return self._stop_event.is_set()
正确的做法
Python 全选
class CookieRefreshThread(Thread):
run = True
def __init__(self):
Thread.__init__(self)
def run(self):
while self.run:
# dosoming()
time.sleep(2)
def myStop(self):
self.run = False
添加了一个myStop 方法,用来退出子线程的while循环
然后主线程退出前,调用 线程的myStop方法
Python 全选
# 开启子线程
t_cookie_listen = CookieRefreshThread(self)
t_cookie_listen.start()
# 做主线程该做的事情
# 主线程执行完毕了,该退出了,先退出子线程
t_cookie_listen.myStop()
版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
post 管理员