前言
在一些场景,在多线程程序中,有时候需要关闭一个线程任务,这就需要我们记住他的线程id,然后才能方便操作
内容
直接上代码,比较简单,意思达到了,可以根据自己的场景使用变换
import threading
import time
import inspect
import ctypes
from loguru import logger
def _async_raise(tid, exctype):
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:
ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)
raise SystemError("PyThreadState_SetAsyncExc failed")
def stop_thread(pid):
# 停止运行
_async_raise(pid, SystemExit)
class Thread(object):
def __init__(self):
self.thread_id = {}
self.pid = None
def test(self,i):
self.thread_id[i] = threading.currentThread().ident
# 获取此线程id
self.pid = threading.currentThread().ident
logger.debug(self.thread_id)
logger.debug(1)
time.sleep(10)
logger.debug(2)
def run(self):
t1 = threading.Thread(target=self.test, args=(1,))
t1.start()
if self.pid:
t2 = threading.Thread(target=stop_thread, args=(self.pid,))
t2.start()
if __name__ == "__main__":
obj = Thread()
obj.run()