python 定時器
python 定時器
在工作中,我們有時候會需要定時去做一些操作,比如凌晨更新遠程代碼,倉庫每小時更新一次遠程分支。這些操作,我們如果要人工進行,不僅要耗費精力,也更容易出錯。
如果一件事情,具有周期操作的特點,那麼把這件事情設置為定時器操作,最合適不過。
在不藉助第三方插件的情況下,python內部可以有多種方式完成定時器操作,這裡介紹一種簡單易行的方法:
利用threading.Timer方法創建一個定時器。
一個簡單的需求,程序啟動5s後在屏幕上列印一個hello
首先介紹一下threading.Timer的使用方法:
class threading.Timer(interval, function, args=[], kwargs={})
創建一個timer,在interval秒過去之後,它將以參數args和關鍵字參數kwargs運行function 。
調用該函數回返回一個定時器的句柄,同時也獲得了一個定時器實例。
但是這時,定時器只是被創建,被沒有啟動,需要調用實例裡面的
start()方法啟動定時器。如果在定時過程中想要取消該定時器,需要使用cancel()函數。
那麼這個小需求,就很簡單了,代碼可以這麼寫:
定義一個定時時間到了,需要調用的函數,方便Timer函數回調,創建定時器實例,並設置定時時間,或得實例後,啟動定時器。
但是我們發現,定時器只執行了一次,如何要定時器,能夠不停的執行下去呢?
一種方法是利用while(True),不停的創建定時器並啟動,顯然這種方法顯得笨拙,而且會一直佔用線程。
另外一種方法,就是在回調函數中,創建定時器並啟動,形成遞歸調用。這裡著重說下這種方法。
運行效果如下:
程序看起來很簡單,通過在回調函數裡面,重新創建定時器,來使得定時器能夠一直工作。
但是值得注意的是,定時器的句柄需要定義成為一個全局變數,這樣做的好處是,創建的定時器進程和實例不會堆積,而是覆蓋,避免不必要的內存佔用。
另外利用threading創建的定時器還有一個好處是,每一個定時器的創建都是在一個新的進程裡面,所以定時器是不阻塞式的,比如,我們創建兩個定時器,讓它們分別列印不同的字元串:
我們運行程序可以看到:
這樣一個簡單的定時器就完成了!
但是這並不是一個十分健壯的定時器,還有很多問題需要考慮,比如,如何終止定時器?在何時使用cancel()?如果創建定時器實例失敗,應該如何處理?等等。
不過一個定時器的基本雛形已經完成了,剩下的就是根據需要添加不同的功能。
推薦閱讀:
※未來電子書會完全取代紙質書嗎?
※怎麼區分原理、定理、定律、理論、概念、效應這些燒腦詞?
※什麼叫民間小調?
※如何在72小時之內快速搞懂一個陌生行業?
※你找到適合自己的讀書方法了嗎?