Timer 一般会设置一个间隔时间,然后才开一个子线程执行需要执行的函数。
cancel() 函数只能取消还未开始执行的 Timer,也就是取消该 Timer。如果 Timer 已经开启子线程执行函数了,用 cancel() 函数 是不能停止子线程执行的,子线程会一直执行,直到结束。
cancel()
:# stop the timer’s action if it’s still waiting
使用下面这个函数强制停止子线程:
import ctypes
import datetime
import inspect
def stop_thread(thread):
tid = thread.ident
exctype = SystemExit
"""raises the exception, performs cleanup if needed"""
tid = ctypes.c_long(tid)
if not inspect.isclass(exctype):
exctype = type(exctype)
res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype))
if res == 0:
raise ValueError("invalid thread id")
elif res != 1:
# """if it returns a number greater than one, you're in trouble,
# and you should call it again with exc=NULL to revert the effect"""
ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)
raise SystemError("PyThreadState_SetAsyncExc failed")
待解决问题:虽然强制停止了,但是 print(str(threading.enumerate()))
仍能看到刚刚强制停止的子线程,这是为什么呢?