【问题标题】:threads stopped using __stop are not removed from threading.enumerate()使用 __stop 停止的线程不会从 threading.enumerate() 中删除
【发布时间】:2016-12-13 03:31:15
【问题描述】:

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

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

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

在线程上执行_Thread__stop 后,我应该怎么做才能确保事情得到清理?

【问题讨论】:

  • Python 中不支持停止线程的方法。特别是,_stop() 方法没有做任何此类事情,并且被设为私有正是因为它是在Thread 的内部簿记之外无法想象使用的实现细节(它确实不会阻止thread - 当线程自行退出时,Thread internals 使用它)。更多信息:stackoverflow.com/questions/18018033/…

标签: python multithreading python-multithreading


【解决方案1】:

扩展我的评论,没有人相信这一点;-),所以这里有一些代码显示它(仅限 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())需要您自担风险。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 2014-08-20
    相关资源
    最近更新 更多