python:weakref.finalize在后台线程处于活动状态时不运行

python:weakref.finalize在后台线程处于活动状态时不运行,python,multithreading,garbage-collection,Python,Multithreading,Garbage Collection,我想在对象看不见时用它来清理一些后台线程,但是当对象在模块范围内时,终结器没有运行 但是请注意,该对象没有对活动线程的引用,我看不出它没有理由不被垃圾收集 显式调用del可以解决问题,但这并不方便 现场演示: 您只需要找到一种方法使a超出范围: def main(): a = A() # when main exits, a will be garbage collected main() 输出: finalizing 正如所指出的,模块级对象仅在卸载模块时才会被垃圾收集,

我想在对象看不见时用它来清理一些后台线程,但是当对象在模块范围内时,终结器没有运行

但是请注意,该对象没有对活动线程的引用,我看不出它没有理由不被垃圾收集

显式调用
del
可以解决问题,但这并不方便

现场演示:


您只需要找到一种方法使
a
超出范围:

def main():
    a = A()
    # when main exits, a will be garbage collected

main()
输出:

finalizing
正如所指出的,模块级对象仅在卸载模块时才会被垃圾收集,因此在实际中解释器退出时也是如此

不幸的是,活动线程也存在于refcount>0的已加载线程模块中,这会阻止当前模块被卸载,从而阻止对象被垃圾收集


因此,确保对象是gc的唯一方法是作用域变量或确保线程自己超时。

是的,我注意到了,但我不希望在对象上使用作用域或上下文,我仍然不知道是什么阻止了它被垃圾收集。进一步调查后,我发现对线程的引用也存在于创建线程()的模块中,这就是为什么模块不会被垃圾收集,因此对象也不会被垃圾收集
finalizing