基本上,我有一些线程可以阻塞I / O但在某些情况下必须停止。整个软件架构已经像这样设计,因此切换到多处理可能会很痛苦。因此,我搜索网页并发现使用thread_ref._Thread__stop()
似乎是唯一可以保证阻止被阻止线程的方法。
现在的问题是,虽然该线程已停止,但它并未从threading.enumerate()
中删除。如果我在其引用上调用isAlive()
,则会返回False
。我试过一个线程的run()
方法正常返回,该线程应该从该列表中删除。
这很糟糕,因为如果线程仍然引用该Thread
对象,理论上不会收集其资源,最终可能导致内存泄漏。
在线程上_Thread__stop
之后,我该怎样做才能确保清理事情?
答案 0 :(得分:2)
扩展我的评论,没有人相信这个;-),所以这里有一些代码显示它(仅限Python 2):
from time import sleep
import threading
def f():
while True:
print("running")
sleep(1)
t = threading.Thread(target=f)
print("starting thread")
t.start()
sleep(.5)
print("'stopping' thread")
t._Thread__stop()
sleep(2)
print("huh! thread is still running")
sleep(10)
输出:
starting thread
running
'stopping' thread
running
running
huh! thread is still running
running
running
running
running
running
running
running
running
running
running
_Thread__stop
对于停止线程没有用(threading
中没有任何其他内容可以强制线程停止)。
做什么做的是将threading
的内部结构置于混乱状态。在这种情况下,因为._stop()
被调用threading
的某些其他部分错误相信线程已经停止,所以Python在最后一次睡眠后快乐退出,尽管非守护程序线程t
仍在运行。
但这不是一个错误:你使用私有的,未记录的方法(如._stop()
),风险自负。