这篇文章的标题几乎总结了我的问题 - 如果该事件被垃圾收集,那么等待Event
的线程会被通知吗?在我的特定情况下,我有一个类,其实例有Event
作为属性,我想知道是否应该在此类上调用__del__
之前实现self.event.set()
方法它收集了垃圾。
我对异步性感到陌生,所以如果事件不是set()
当他们被垃圾收集时,这可能是不好的做法,最好让线程挂起?提前感谢任何回复。
答案 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
通过魔法设置而不是。但它不会在实践中出现,所以不要担心; - )