Python - 是`threading.Event`" set"垃圾收集期间?

时间:2016-06-16 18:02:56

标签: python multithreading events garbage-collection

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

我对异步性感到陌生,所以如果事件不是set()当他们被垃圾收集时,这可能是不好的做法,最好让线程挂起?提前感谢任何回复。

2 个答案:

答案 0 :(得分:2)

由于其他对象持有对事件的引用,因此事件本身不会被删除或被垃圾回收。它不知道您的对象正在被删除。您是否希望您的类具有__del__以在删除对象时设置事件(自然地通过使其ref计数变为零或通过垃圾收集)完全取决于您的事件系统设计。假设我有十几个引用该事件的对象。我想在每个人离开时发生这个事件吗?取决于!

答案 1 :(得分:1)

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

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在解释器关闭处理过程中尝试.join()线程。

在一个线程中运行的函数f()创建一个C的实例,该实例在检索到e属性后立即变为垃圾。因此调用其__del__方法,并显示“离开”。

您可以从行为中推断出,不是,垃圾Event通过魔法设置而不是。但它不会在实践中出现,所以不要担心; - )