2015-06-18 31 views
0

有沒有辦法在退出之前獲取所有活動的threading.Timer對象的列表以便cancel所有這些對象?否則,程序會掛起,等待其完成。列出所有活動的多線程。定時器對象

我可以保留它們的列表,但當它們被觸發時,我也必須將它們刪除。相反,我想知道是否有辦法獲得所有這些。

+0

不,沒有自動全局列表。你應該註冊你的定時器,也許你把它們添加到'weakref.WeakSet'。退出時,調用'cancel()'並捕獲任何異常。 –

+0

@KlausD。似乎是合法的,爲什麼你不把它轉換成答案,以便我可以接受它? –

+0

它們不會出現在'''threading.enumerate()'''結果? – wwii

回答

2

threading.enumerate()回報一個將包括定時器的列表是Alive - 它們是threading._Timer的實例。

>>> t = threading.Timer(30, foo, kwargs = d) 
>>> t.start() 
>>> t.isAlive() 
True 
>>> for thing in threading.enumerate(): 
    if isinstance(thing, threading._Timer): 
     thing.cancel() 


>>> t.isAlive() 
False 
>>> 
1

如果你只需要取消計時器從程序退出時,您可以設置daemon標誌的計時器,他們將在退出被殺死,而不是等待它們完成:

from threading import Timer 
timer = Timer(10, fn) 
timer.setDaemon(True) 
timer.start()