Python:weakref.完成如果后台线程为ali,则不运行

2024-03-28 17:28:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在对象不可见时使用^{}来清理一些后台线程,但当对象在模块作用域中时,终结器不会运行(编辑:)。

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

显式调用^{{cd2>}解决了问题,但这很不方便。

现场演示:https://ideone.com/kTZsbs

import weakref
import threading


def do(l):
    l.acquire()


class A:
    def __init__(self):
        l = threading.Lock()
        l.acquire()
        t = threading.Thread(target=do, args=[l])
        t.start()

        weakref.finalize(self, A._finalize, t, l)

    @staticmethod
    def _finalize(t, l):
        print("finalizing")
        l.release()
        t.join()


a = A()
# del a does trigger _finalize though

Tags: 模块对象importself编辑def线程作用域
2条回答

正如@quamrana所指出的,模块级对象只在卸载模块时得到垃圾回收,因此在实际中解释器退出时。在

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

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

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

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

main()

输出:

^{pr2}$

相关问题 更多 >