[英]Python - is `threading.Event` “set” during garbage collection?
這篇文章的標題幾乎概括了我的問題-如果該事件已被垃圾回收,是否會通知等待該Event
線程? 在我的具體情況我有一個類,其實例有一個Event
作為一個屬性,我想知道我是否應該實施__del__
這個類的調用方法self.event.set()
是垃圾回收之前。
我是異步的新手,所以如果在垃圾回收時不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嘗試將.join()
線程作為解釋器關閉處理的一部分。
運行在線程中的函數f()
創建C
的實例,該實例在獲取e
屬性后立即變為垃圾。 因此,將調用其__del__
方法,並顯示“ going away”。
您可以從,不,垃圾的行為推斷Event
沒有得到魔法設置。 但這在實踐中不會出現,所以不用擔心;-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.