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小時之內快速搞懂一個陌生行業?
你找到適合自己的讀書方法了嗎?

TAG:Python入門 | 學習 | Python編程 |