簡體   English   中英

Python-在垃圾收集期間是否設置了“ threading.Event”?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM