Python - 是"线程化"。垃圾回收期间的事件"set"?



这篇文章的标题几乎总结了我的问题 - 如果收集了该事件,会在Event上等待CC_1的线程吗?在我的特殊情况下,我有一个类,其实例将Event作为属性,我想知道我是否应该在此类中实现__del__方法,该方法在收集垃圾之前调用self.event.set()

我是异步性的新手,因此,如果事件收集到垃圾时,请不要使用set(),也许这样做是不好的做法,最好让线程挂起?预先感谢您的任何答复。

由于其他对象包含对事件的引用,因此事件本身不会被删除或收集垃圾。它不知道您的对象正在被删除。无论您是否希望类具有删除对象时设置事件的__del__(自然要通过其裁判计数为零,或者虽然垃圾收集却是垃圾收集)都完全取决于您的事件系统设计。假设我有十几个引用事件的对象。我是否要当每个活动消失时都会解雇活动?依赖!

请注意,等待Event的情况不一定意味着Event不在垃圾中。循环垃圾是一种可能性,这是另一个:

import threading
class C(object):
    def __init__(self):
        self.e = threading.Event()
    def __del__(self):
        print("going away")
def f():
    C().e.wait()
t = threading.Thread(target=f)
t.start()
print("main ending")

打印:

going away
main ending

然后它永远悬挂,因为Python试图将线程作为解释器关闭处理的一部分。

在线程中运行的函数f()创建了C的实例,该实例在检索其e属性后立即变成垃圾。因此,它的__del__方法被称为,并且显示"走开"。

您可以从行为中推断出,不,垃圾Event dos not 获得魔术设置。但这不会在实践中出现,所以不用担心; - )

最新更新