是否有可能终止一个正在运行的线程而不设置/检查任何标志/信号/等等?
当前回答
没有官方API来做这个,没有。
你需要使用平台API来杀死线程,例如pthread_kill或TerminateThread。你可以访问这样的API,例如通过pythonwin,或通过ctypes。
注意,这本质上是不安全的。这可能会导致不可收集的垃圾(来自堆栈帧的局部变量,成为垃圾),并可能导致死锁,如果被杀死的线程在被杀死时具有GIL。
其他回答
如果您试图终止整个程序,您可以将线程设置为“守护进程”。看到 Thread.daemon
假设,你想有多个线程的同一个函数,这是IMHO最简单的实现通过id停止一个:
import time
from threading import Thread
def doit(id=0):
doit.stop=0
print("start id:%d"%id)
while 1:
time.sleep(1)
print(".")
if doit.stop==id:
doit.stop=0
break
print("end thread %d"%id)
t5=Thread(target=doit, args=(5,))
t6=Thread(target=doit, args=(6,))
t5.start() ; t6.start()
time.sleep(2)
doit.stop =5 #kill t5
time.sleep(2)
doit.stop =6 #kill t6
这里的好处是,你可以有多个相同或不同的函数,并通过functionname。stop来停止它们
如果你想只有一个线程的函数,那么你不需要记住id。如果做了,就停下来。停止> 0。
这似乎与windows 7上的pywin32一起工作
my_thread = threading.Thread()
my_thread.start()
my_thread._Thread__stop()
这里还有另一种方法,但代码非常干净和简单,适用于2021年的Python 3.7:
import ctypes
def kill_thread(thread):
"""
thread: a threading.Thread object
"""
thread_id = thread.ident
res = ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, ctypes.py_object(SystemExit))
if res > 1:
ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, 0)
print('Exception raise failure')
改编自:https://www.geeksforgeeks.org/python-different-ways-to-kill-a-thread/
这是一个糟糕的答案,请看评论
以下是如何做到这一点:
from threading import *
...
for thread in enumerate():
if thread.isAlive():
try:
thread._Thread__stop()
except:
print(str(thread.getName()) + ' could not be terminated'))
给它几秒钟,然后你的线程应该停止。还要检查thread._Thread__delete()方法。
为了方便,我建议使用thread.quit()方法。例如,如果你的线程中有一个套接字,我建议在你的套接字句柄类中创建一个quit()方法,终止套接字,然后在你的quit()中运行一个thread. _thread__stop()。