Python?4種實(shí)現(xiàn)定時(shí)任務(wù)的方案
1.利用 while True: + sleep() 實(shí)現(xiàn)定時(shí)任務(wù)
位于 time 模塊中的 sleep(secs) 函數(shù),可以實(shí)現(xiàn)令當(dāng)前執(zhí)行的線程暫停 secs 秒后再繼續(xù)執(zhí)行。所謂暫停,即令當(dāng)前線程進(jìn)入阻塞狀態(tài),當(dāng)達(dá)到 sleep() 函數(shù)規(guī)定的時(shí)間后,再由阻塞狀態(tài)轉(zhuǎn)為就緒狀態(tài),等待 CPU 調(diào)度。
基于這樣的特性我們可以通過 while 死循環(huán)+sleep() 的方式實(shí)現(xiàn)簡(jiǎn)單的定時(shí)任務(wù)。
代碼示例:
import datetime
import time
def time_printer():
now = datetime.datetime.now()
ts = now.strftime('%Y-%m-%d %H:%M:%S')
print('do func time :', ts)
def loop_monitor():
while True:
time_printer()
time.sleep(5) # 暫停 5 秒
if __name__ == "__main__":
loop_monitor()
主要缺點(diǎn):
- 只能設(shè)定間隔,不能指定具體的時(shí)間,比如每天早上 8:00
sleep是一個(gè)阻塞函數(shù),也就是說sleep這一段時(shí)間,程序什么也不能操作。
2.使用 Timeloop 庫運(yùn)行定時(shí)任務(wù)
Timeloop[2] 是一個(gè)庫,可用于運(yùn)行多周期任務(wù)。這是一個(gè)簡(jiǎn)單的庫,它使用 decorator 模式在線程中運(yùn)行標(biāo)記函數(shù)。
示例代碼:
import time
from timeloop import Timeloop
from datetime import timedelta
tl = Timeloop()
@tl.job(interval=timedelta(seconds=2))
def sample_job_every_2s():
print "2s job current time : {}".format(time.ctime())
@tl.job(interval=timedelta(seconds=5))
def sample_job_every_5s():
print "5s job current time : {}".format(time.ctime())
@tl.job(interval=timedelta(seconds=10))
def sample_job_every_10s():
print "10s job current time : {}".format(time.ctime())
3.利用 threading.Timer 實(shí)現(xiàn)定時(shí)任務(wù)
threading 模塊中的 Timer 是一個(gè)非阻塞函數(shù),比 sleep 稍好一點(diǎn),timer 最基本理解就是定時(shí)器,我們可以啟動(dòng)多個(gè)定時(shí)任務(wù),這些定時(shí)器任務(wù)是異步執(zhí)行,所以不存在等待順序執(zhí)行問題。
Timer(interval, function, args=[ ], kwargs={ })
interval: 指定的時(shí)間function: 要執(zhí)行的方法args/kwargs: 方法的參數(shù)
代碼示例:
import datetime
from threading import Timer
def time_printer():
now = datetime.datetime.now()
ts = now.strftime('%Y-%m-%d %H:%M:%S')
print('do func time :', ts)
loop_monitor()
def loop_monitor():
t = Timer(5, time_printer)
t.start()
if __name__ == "__main__":
loop_monitor()
備注:Timer 只能執(zhí)行一次,這里需要循環(huán)調(diào)用,否則只能執(zhí)行一次
4.利用內(nèi)置模塊 sched 實(shí)現(xiàn)定時(shí)任務(wù)
sched 模塊實(shí)現(xiàn)了一個(gè)通用事件調(diào)度器,在調(diào)度器類使用一個(gè)延遲函數(shù)等待特定的時(shí)間,執(zhí)行任務(wù)。同時(shí)支持多線程應(yīng)用程序,在每個(gè)任務(wù)執(zhí)行后會(huì)立刻調(diào)用延時(shí)函數(shù),以確保其他線程也能執(zhí)行。
class sched.scheduler(timefunc, delayfunc) 這個(gè)類定義了調(diào)度事件的通用接口,它需要外部傳入兩個(gè)參數(shù),timefunc 是一個(gè)沒有參數(shù)的返回時(shí)間類型數(shù)字的函數(shù)(常用使用的如 time 模塊里面的 time),delayfunc 應(yīng)該是一個(gè)需要一個(gè)參數(shù)來調(diào)用、與 timefunc 的輸出兼容、并且作用為延遲多個(gè)時(shí)間單位的函數(shù)(常用的如 time 模塊的 sleep)。
代碼示例:
import datetime
import time
import sched
def time_printer():
now = datetime.datetime.now()
ts = now.strftime('%Y-%m-%d %H:%M:%S')
print('do func time :', ts)
loop_monitor()
def loop_monitor():
s = sched.scheduler(time.time, time.sleep) # 生成調(diào)度器
s.enter(5, 1, time_printer, ())
s.run()
if __name__ == "__main__":
loop_monitor()
scheduler 對(duì)象主要方法:
enter(delay, priority, action, argument),安排一個(gè)事件來延遲 delay 個(gè)時(shí)間單位。cancel(event):從隊(duì)列中刪除事件。如果事件不是當(dāng)前隊(duì)列中的事件,則該方法將跑出一個(gè)ValueError。run():運(yùn)行所有預(yù)定的事件。這個(gè)函數(shù)將等待(使用傳遞給構(gòu)造函數(shù)的delayfunc()函數(shù)),然后執(zhí)行事件,直到不再有預(yù)定的事件。
個(gè)人點(diǎn)評(píng):比 threading.Timer 更好,不需要循環(huán)調(diào)用。
到此這篇關(guān)于Python 4種實(shí)現(xiàn)定時(shí)任務(wù)的方案的文章就介紹到這了,更多相關(guān)Python 實(shí)現(xiàn)定時(shí)任務(wù)方案內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python裝飾器入門學(xué)習(xí)教程(九步學(xué)習(xí))
裝飾器(decorator)是一種高級(jí)Python語法。裝飾器可以對(duì)一個(gè)函數(shù)、方法或者類進(jìn)行加工。本文給大家介紹Python裝飾器入門學(xué)習(xí)教程(九步學(xué)習(xí)),對(duì)python裝飾器相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-01-01
Python中將兩個(gè)或多個(gè)list合成一個(gè)list的方法小結(jié)
python中,list這種數(shù)據(jù)結(jié)構(gòu)很常用到,如果兩個(gè)或者多個(gè)list結(jié)構(gòu)相同,內(nèi)容類型相同,我們通常會(huì)將兩個(gè)或者多個(gè)list合并成一個(gè),這樣我們?cè)傺h(huán)遍歷的時(shí)候就可以一次性處理掉了2019-05-05
python中迭代器(iterator)用法實(shí)例分析
這篇文章主要介紹了python中迭代器(iterator)用法,實(shí)例分析了Python中迭代器的相關(guān)使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
Python實(shí)現(xiàn)JS解密并爬取某音漫客網(wǎng)站
這篇文章主要介紹了Python實(shí)現(xiàn)JS解密并爬取某音漫客網(wǎng)站,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
python函數(shù)之任意數(shù)量的實(shí)參方式
這篇文章主要介紹了python函數(shù)之任意數(shù)量的實(shí)參方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02
python實(shí)現(xiàn)樹形打印目錄結(jié)構(gòu)
這篇文章主要為大家詳細(xì)介紹了python樹形打印目錄結(jié)構(gòu)的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
如何使用python獲取現(xiàn)在的日期與時(shí)間
學(xué)習(xí)了一段時(shí)間的python,不知道大家對(duì)于代碼的編寫有了屬于自己的一套思路了呢,下面這篇文章主要給大家介紹了關(guān)于如何使用python獲取現(xiàn)在的日期與時(shí)間的相關(guān)資料,需要的朋友可以參考下2022-11-11
Python深度學(xué)習(xí)實(shí)戰(zhàn)PyQt5窗口切換的堆疊布局示例詳解
本文以堆疊窗口控件為例,詳細(xì)介紹堆疊布局的界面設(shè)計(jì)和程序?qū)崿F(xiàn)過程,通過案例帶小白創(chuàng)建一個(gè)典型的堆疊布局多窗口切換程序2021-10-10

