没有办法杀死线程。你必须从目标内部杀死目标。最好的方法是使用钩子和队列。它是这样的。
import Threading
from Queue import Queue
# add a kill_hook arg to your function, kill_hook
# is a queue used to pass messages to the main thread
def myfunc(*args, **kwargs, kill_hook=None):
#Code goes here
# put this somewhere which is periodically checked.
# an ideal place to check the hook is when logging
try:
if q.get_nowait(): # or use q.get(True, 5) to wait a longer
print 'Exiting!'
raise SystemExit(0)
except Queue.empty:
pass
q = Queue() # the queue used to pass the kill call
t=threading.Thread(target=myfunc, args = q)
t.start()
d1=datetime.datetime.utcnow()
while threading.active_count()>1:
if (datetime.datetime.utcnow()-d1).total_seconds()>60:
# if your kill criteria are met, put something in the queue
q.put(1)
我最初在网上的某个地方找到了这个答案,可能是这个。希望这可以帮助!
另一种解决方案是使用单独的 Python 实例,并使用psutils监视另一个 Python 线程,从系统级别将其杀死。
哇,我也喜欢守护进程和隐形 os._exit 解决方案!