利用Python實(shí)現(xiàn)定時(shí)程序的方法
定時(shí)器概念
什么是定時(shí)器呢?它是指從指定的時(shí)刻開始,經(jīng)過(guò)一個(gè)指定時(shí)間,然后觸發(fā)一個(gè)事件,用戶可以自定義定時(shí)器的周期與頻率。
實(shí)現(xiàn)一個(gè)簡(jiǎn)單的定時(shí)程序
方案一
在 Python 中,如何定義一個(gè)定時(shí)器函數(shù)呢?我們先看第一種方法。假設(shè)我們需要執(zhí)行一個(gè)函數(shù)userCountFunc,這個(gè)函數(shù)需要每隔一個(gè)小時(shí)被執(zhí)行一次。那么,我們可以這樣寫:
def main():
startCronTask(userCountFunc, minutes=60)
if __name__ == '__main__':
main()
如上面的代碼,我們?cè)诙x了一個(gè) main 函數(shù)后,便定義了一個(gè)定時(shí)函數(shù) startCronTask。第一個(gè)參數(shù)為函數(shù)名,第二個(gè)參數(shù)為時(shí)間,第二個(gè)參數(shù)表示多長(zhǎng)時(shí)間后調(diào)用后面第一個(gè)參數(shù)的函數(shù)。第一個(gè)參數(shù)注意是函數(shù)對(duì)象,進(jìn)行參數(shù)傳遞,用函數(shù)名(如 userCountFunc)表示該對(duì)象,不是函數(shù)執(zhí)行語(yǔ)句 userCountFunc(),不然會(huì)報(bào)錯(cuò)。那么,在實(shí)現(xiàn)這個(gè)函數(shù)時(shí),需要引入定時(shí)功能,Python 中有一個(gè)定時(shí)任務(wù)模塊 BlockingScheduler:
from apscheduler.schedulers.blocking import BlockingScheduler
def startCronTask(task, **config):
# BlockingScheduler
scheduler = BlockingScheduler()
scheduler.add_job(task, 'interval', **config)
scheduler.start()
定義完一個(gè)調(diào)度模塊之后,實(shí)際的定時(shí)調(diào)度功能就完成了。接下來(lái),需要具體實(shí)現(xiàn)定時(shí)執(zhí)行的邏輯函數(shù) userCountFunc:
def userCountFunc():
logger.info('count user')
...
這樣,對(duì)于方案一,實(shí)現(xiàn)的簡(jiǎn)單的定時(shí)功能就完成了。
方案二
方案一中介紹的是 Python 自帶的 BlockingScheduler 模塊,Python 中除了可以通過(guò) BlockingScheduler,還通過(guò)線程實(shí)現(xiàn)定時(shí)器 timer,來(lái)簡(jiǎn)單的看下代碼:
import threading
def timerFunc():
print('Hello World~')
timer = threading.Timer(1, timerFunc)
timer.start()
在上面的代碼中,定時(shí)器函數(shù) threading.Timer 主要有2個(gè)參數(shù),參數(shù)意義與方案一類似,接下來(lái)執(zhí)行這段程序:
Hello World~
Process finished with exit code 0
我們發(fā)現(xiàn)只執(zhí)行一遍,程序就結(jié)束了,但顯然不是我們想要的結(jié)果。其實(shí),我們看下 Time 類,有這樣的一句解釋性注釋:Call a function after a specified number of seconds,我們發(fā)現(xiàn)上面在執(zhí)行后并未循環(huán)執(zhí)行,所以需要修改下:
import threading
def timerFunc():
print('Hello World~')
global timer
timer = threading.Timer(10.5, timerFunc)
timer.start()
timer = threading.Timer(3, timerFunc)
timer.start()
此時(shí),我們可以看到輸出結(jié)果:
Hello World~
Hello World~
Hello World~
...
這里需要注意的是:必須在定時(shí)器執(zhí)行函數(shù)內(nèi)部重復(fù)構(gòu)造定時(shí)器,因?yàn)槎〞r(shí)器構(gòu)造后只執(zhí)行1次,必須循環(huán)調(diào)用。
另外,在上面的代碼中,我們其實(shí)還可以看到:threading.Timer(5.5, timerFunc),定時(shí)器間隔單位是秒,可以是浮點(diǎn)數(shù),如5.5,0.9等,在執(zhí)行函數(shù) timerFunc 內(nèi)部和外部中給的值可以不同。如上例中第一次執(zhí)行 timerFunc 是3秒后,后面的都是10.5秒后執(zhí)行。
接下來(lái),我們?cè)倏纯慈绾卧僖欢〞r(shí)間結(jié)束定時(shí)功能。我們可以使用cancel停止定時(shí)器的工作,如下例:
import threading
def timerFunc():
print('Hello World~')
global timer
timer = threading.Timer(10.5, timerFunc)
timer.start()
timer = threading.Timer(3, timerFunc)
timer.start()
time.sleep(60)
timer.cancel()
上面的代碼表示:在定時(shí)器按照一定時(shí)間執(zhí)行后,執(zhí)行過(guò)程耗時(shí)60秒后停止定時(shí)操作功能,退出。顯示結(jié)果為:
Hello World~
Hello World~
Hello World~
Hello World~
Hello World~
...Process finished with exit code 0
到此這篇關(guān)于利用Python實(shí)現(xiàn)定時(shí)程序的方法的文章就介紹到這了,更多相關(guān)Python 定時(shí)程序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于pytorch的RNN實(shí)現(xiàn)字符級(jí)姓氏文本分類的示例代碼
當(dāng)使用基于PyTorch的RNN實(shí)現(xiàn)字符級(jí)姓氏文本分類時(shí),我們可以使用一個(gè)非常簡(jiǎn)單的RNN模型來(lái)處理輸入的字符序列,并將其應(yīng)用于姓氏分類任務(wù),本文給大家舉了一個(gè)基本的示例代碼,需要的朋友可以參考下2023-12-12
Python中staticmethod和classmethod的作用與區(qū)別
今天小編就為大家分享一篇關(guān)于Python中staticmethod和classmethod的作用與區(qū)別,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10
解決Python print 輸出文本顯示 gbk 編碼錯(cuò)誤問(wèn)題
這篇文章主要介紹了解決Python print 輸出文本顯示 gbk 編碼錯(cuò)誤問(wèn)題,本文給出了三種解決方法,需要的朋友可以參考下2018-07-07
用Python實(shí)現(xiàn)大文本文件切割的方法
今天小編就為大家分享一篇用Python實(shí)現(xiàn)大文本文件切割的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
基于Python實(shí)現(xiàn)萬(wàn)年歷制作
制作一個(gè)萬(wàn)年歷是一個(gè)有趣的Python項(xiàng)目,它可以讓您查看任何年份的日歷并獲得特定日期的信息,下面我們就來(lái)看看具體是如何使用Python實(shí)現(xiàn)的吧2023-12-12
Python字符串對(duì)象實(shí)現(xiàn)原理詳解
這篇文章主要介紹了Python字符串對(duì)象實(shí)現(xiàn)原理詳解,在Python世界中將對(duì)象分為兩種:一種是定長(zhǎng)對(duì)象,比如整數(shù),整數(shù)對(duì)象定義的時(shí)候就能確定它所占用的內(nèi)存空間大小,另一種是變長(zhǎng)對(duì)象,在對(duì)象定義時(shí)并不知道是多少,需要的朋友可以參考下2019-07-07

