使用__stop停止的线程不会从threading.enumerate()中删除

时间:2016-08-07 04:29:24

标签: python multithreading python-multithreading

基本上,我有一些线程可以阻塞I / O但在某些情况下必须停止。整个软件架构已经像这样设计,因此切换到多处理可能会很痛苦。因此,我搜索网页并发现使用thread_ref._Thread__stop()似乎是唯一可以保证阻止被阻止线程的方法。

现在的问题是,虽然该线程已停止,但它并未从threading.enumerate()中删除。如果我在其引用上调用isAlive(),则会返回False。我试过一个线程的run()方法正常返回,该线程应该从该列表中删除。

这很糟糕,因为如果线程仍然引用该Thread对象,理论上不会收集其资源,最终可能导致内存泄漏。

在线程上_Thread__stop之后,我该怎样做才能确保清理事情?

1 个答案:

答案 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()),风险自负。