Python定時(shí)任務(wù)框架APScheduler安裝使用詳解
前言
在日常工作中,如果想要簡(jiǎn)化工作流程實(shí)現(xiàn)辦公自動(dòng)化,那么幾乎有大半的功能模塊都需要使用定時(shí)任務(wù),例如定時(shí)收發(fā)郵件,或者定時(shí)發(fā)微信或是檢測(cè)垃圾郵件等等,而在python中常用實(shí)現(xiàn)定時(shí)任務(wù)的包含以下四種方法:
- while True: + sleep()
- threading.Timer定時(shí)器
- 調(diào)度模塊schedule
- 任務(wù)框架APScheduler
但在實(shí)際測(cè)試中,可以發(fā)現(xiàn):
循環(huán)+sleep方式可以用來(lái)做簡(jiǎn)單測(cè)試。
timer可以實(shí)現(xiàn)異步定時(shí)任務(wù)。
schedule可以定點(diǎn)定時(shí)執(zhí)行,但是仍然需要while Ture配合,而且占用內(nèi)存大。
APScheduler框架更加強(qiáng)大,可以直接在里面添加定點(diǎn)與定時(shí)任務(wù),無(wú)可挑剔?。?!
所以接下來(lái)講介紹如何使用APscheduler實(shí)現(xiàn)python定時(shí)任務(wù)?。?!
一、APscheduler簡(jiǎn)介
APscheduler全稱Advanced Python Scheduler,作用為在指定的時(shí)間規(guī)則執(zhí)行指定的作業(yè),其是基于Quartz的一個(gè)Python定時(shí)任務(wù)框架,實(shí)現(xiàn)了Quartz的所有功能,使用起來(lái)十分方便。提供了基于日期、固定時(shí)間間隔以及crontab類型的任務(wù),并且可以持久化任務(wù)。基于這些功能,我們可以很方便的實(shí)現(xiàn)一個(gè)python定時(shí)任務(wù)系統(tǒng)。
二、APscheduler安裝
我們通過(guò)Anaconda管理虛擬環(huán)境,并進(jìn)行APscheduler庫(kù)的安裝。
pip install apscheduler
三、APscheduler組成部分
觸發(fā)器(trigger):包含調(diào)度邏輯,每一個(gè)作業(yè)有它自己的觸發(fā)器,用于決定接下來(lái)哪一個(gè)作業(yè)會(huì)運(yùn)行。除了他們自己初始配置意外,觸發(fā)器完全是無(wú)狀態(tài)的。
作業(yè)存儲(chǔ)(job store):存儲(chǔ)被調(diào)度的作業(yè),默認(rèn)的作業(yè)存儲(chǔ)是簡(jiǎn)單地把作業(yè)保存在內(nèi)存中,其他的作業(yè)存儲(chǔ)是將作業(yè)保存在數(shù)據(jù)庫(kù)中。一個(gè)作業(yè)的數(shù)據(jù)講在保存在持久化作業(yè)存儲(chǔ)時(shí)被序列化,并在加載時(shí)被反序列化。調(diào)度器不能分享同一個(gè)作業(yè)存儲(chǔ)。
執(zhí)行器(executor):處理作業(yè)的運(yùn)行,他們通常通過(guò)在作業(yè)中提交制定的可調(diào)用對(duì)象到一個(gè)線程或者進(jìn)城池來(lái)進(jìn)行。當(dāng)作業(yè)完成時(shí),執(zhí)行器將會(huì)通知調(diào)度器。
調(diào)度器(scheduler):其他的組成部分。通常在應(yīng)用只有一個(gè)調(diào)度器,應(yīng)用的開發(fā)者通常不會(huì)直接處理作業(yè)存儲(chǔ)、調(diào)度器和觸發(fā)器,相反,調(diào)度器提供了處理這些的合適的接口。配置作業(yè)存儲(chǔ)和執(zhí)行器可以在調(diào)度器中完成,例如添加、修改和移除作業(yè)?!?/p>
1.Job 作業(yè)
作用:
Job作為APScheduler最小執(zhí)行單位。
創(chuàng)建Job時(shí)指定執(zhí)行的函數(shù),函數(shù)中所需參數(shù),Job執(zhí)行時(shí)的一些設(shè)置信息。
構(gòu)建說(shuō)明:
id:指定作業(yè)的唯一ID
name:指定作業(yè)的名字
trigger:apscheduler定義的觸發(fā)器,用于確定Job的執(zhí)行時(shí)間,根據(jù)設(shè)置的trigger規(guī)則,計(jì)算得到下次執(zhí)行此job的
時(shí)間, 滿足時(shí)將會(huì)執(zhí)行
executor:apscheduler定義的執(zhí)行器,job創(chuàng)建時(shí)設(shè)置執(zhí)行器的名字,根據(jù)字符串你名字到scheduler獲取到執(zhí)行此
job的 執(zhí)行器,執(zhí)行job指定的函數(shù)
max_instances:執(zhí)行此job的最大實(shí)例數(shù),executor執(zhí)行job時(shí),根據(jù)job的id來(lái)計(jì)算執(zhí)行次數(shù),根據(jù)設(shè)置的最大實(shí)例數(shù)
來(lái)確定是否可執(zhí)行
next_run_time:Job下次的執(zhí)行時(shí)間,創(chuàng)建Job時(shí)可以指定一個(gè)時(shí)間[datetime],不指定的話則默認(rèn)根據(jù)trigger獲取觸
發(fā)時(shí)間
misfire_grace_time:Job的延遲執(zhí)行時(shí)間,例如Job的計(jì)劃執(zhí)行時(shí)間是21:00:00,但因服務(wù)重啟或其他原因?qū)е?br />21:00:31才執(zhí)行,如果設(shè)置此key為40,則該job會(huì)繼續(xù)執(zhí)行,否則將會(huì)丟棄此job
coalesce:Job是否合并執(zhí)行,是一個(gè)bool值。例如scheduler停止20s后重啟啟動(dòng),而job的觸發(fā)器設(shè)置為5s執(zhí)行
一次,因此此job錯(cuò)過(guò)了4個(gè)執(zhí)行時(shí)間,如果設(shè)置為是,則會(huì)合并到一次執(zhí)行,否則會(huì)逐個(gè)執(zhí)行
func:Job執(zhí)行的函數(shù)
args:Job執(zhí)行函數(shù)需要的位置參數(shù)
kwargs:Job執(zhí)行函數(shù)需要的關(guān)鍵字參數(shù)
2.Trigger 觸發(fā)器
包含調(diào)度邏輯,每一個(gè)作業(yè)有它自己的觸發(fā)器,用于決定接下來(lái)哪一個(gè)作業(yè)會(huì)運(yùn)行。除了它們自己初始配置以外,觸發(fā)器完全是無(wú)狀態(tài)的。
APScheduler 有三種內(nèi)建的 trigger:
- date: 特定的時(shí)間點(diǎn)觸發(fā)
- interval: 固定時(shí)間間隔觸發(fā)
- cron: 在特定時(shí)間周期性地觸發(fā)
觸發(fā)器就是根據(jù)你指定的觸發(fā)方式,比如是按照時(shí)間間隔,還是按照 crontab觸發(fā),觸發(fā)條件是什么等。每個(gè)任務(wù)都有自己的觸發(fā)器。
3.Jobstore 作業(yè)存儲(chǔ)
如果你的應(yīng)用在每次啟動(dòng)的時(shí)候都會(huì)重新創(chuàng)建作業(yè),那么使用默認(rèn)的作業(yè)存儲(chǔ)器(MemoryJobStore)即可,但是如果你需要在調(diào)度器重啟或者應(yīng)用程序奔潰的情況下任然保留作業(yè),你應(yīng)該根據(jù)你的應(yīng)用環(huán)境來(lái)選擇具體的作業(yè)存儲(chǔ)器。例如:使用Mongo或者SQLAlchemy JobStore (用于支持大多數(shù)RDBMS)。
任務(wù)存儲(chǔ)器是可以存儲(chǔ)任務(wù)的地方,默認(rèn)情況下任務(wù)保存在內(nèi)存,也可將任務(wù)保存在各種數(shù)據(jù)庫(kù)中。任務(wù)存儲(chǔ)進(jìn)去后,會(huì)進(jìn)行序列化,然后也可以反序列化提取出來(lái),繼續(xù)執(zhí)行。
4.Executor 執(zhí)行器
Executor在scheduler中初始化,另外也可通過(guò)scheduler的add_executor動(dòng)態(tài)添加Executor。
每個(gè)executor都會(huì)綁定一個(gè)alias,這個(gè)作為唯一標(biāo)識(shí)綁定到Job,在實(shí)際執(zhí)行時(shí)會(huì)根據(jù)Job綁定的executor。找到實(shí)際的執(zhí)行器對(duì)象,然后根據(jù)執(zhí)行器對(duì)象執(zhí)行Job。
Executor的種類會(huì)根據(jù)不同的調(diào)度來(lái)選擇,如果選擇AsyncIO作為調(diào)度的庫(kù),那么選擇AsyncIOExecutor,如果選擇tornado作為調(diào)度的庫(kù),選擇TornadoExecutor,如果選擇啟動(dòng)進(jìn)程作為調(diào)度,選擇ThreadPoolExecutor或者ProcessPoolExecutor都可以。
Executor的選擇需要根據(jù)實(shí)際的scheduler來(lái)選擇不同的執(zhí)行器。
處理作業(yè)的運(yùn)行,它們通常通過(guò)在作業(yè)中提交制定的可調(diào)用對(duì)象到一個(gè)線程或者進(jìn)城池來(lái)進(jìn)行。當(dāng)作業(yè)完成時(shí),執(zhí)行器將會(huì)通知調(diào)度器。
5.scheduler 調(diào)度器
Scheduler是APScheduler的核心,所有相關(guān)組件通過(guò)其定義。scheduler啟動(dòng)之后,將開始按照配置的任務(wù)進(jìn)行調(diào)度。除了依據(jù)所有定義Job的trigger生成的將要調(diào)度時(shí)間喚醒調(diào)度之外。當(dāng)發(fā)生Job信息變更時(shí)也會(huì)觸發(fā)調(diào)度。
scheduler可根據(jù)自身的需求選擇不同的組件,如果是使用AsyncIO則選擇AsyncIOScheduler,使用tornado則選擇TornadoScheduler。
任務(wù)調(diào)度器是屬于整個(gè)調(diào)度的總指揮官。它會(huì)合理安排作業(yè)存儲(chǔ)器、執(zhí)行器、觸發(fā)器進(jìn)行工作,并進(jìn)行添加和刪除任務(wù)等。調(diào)度器通常是只有一個(gè)的。開發(fā)人員很少直接操作觸發(fā)器、存儲(chǔ)器、執(zhí)行器等。因?yàn)檫@些都由調(diào)度器自動(dòng)來(lái)實(shí)現(xiàn)了。
四、Scheduler工作流程圖
1.Scheduler添加job流程
2.Scheduler調(diào)度流程
五、APscheduler使用
1.簡(jiǎn)單應(yīng)用
import time from apscheduler.schedulers.blocking import BlockingScheduler def my_job(i): print (i) sched = BlockingScheduler() sched.add_job(my_job, 'interval', seconds=5,values=['學(xué)會(huì)了']) sched.start()
輸出:
2.操作作業(yè)
2.1 date觸發(fā)器
date 是最基本的一種調(diào)度,作業(yè)任務(wù)只會(huì)執(zhí)行一次。它表示特定的時(shí)間點(diǎn)觸發(fā)。它的參數(shù)如下:
參數(shù) | 說(shuō)明 |
run_date(datetime or str) | 任務(wù)運(yùn)行的日期或者時(shí)間 |
timezone(datetime.tzinfo or str) | 指定時(shí)區(qū) |
import datetime from apscheduler.schedulers.blocking import BlockingScheduler scheduler = BlockingScheduler() def my_job(text): print(text) # datetime類型(用于精確時(shí)間) scheduler.add_job(my_job, 'date', run_date=datetime(2022, 4, 25, 17, 30, 5), args=['測(cè)試任務(wù)']) scheduler.start()
注意:run_date參數(shù)可以是date類型、datetime類型或文本類型。
2.2 interval觸發(fā)器
固定時(shí)間間隔觸發(fā)。interval 間隔調(diào)度,參數(shù)如下:
參數(shù) | 說(shuō)明 |
weeks(int) | 間隔幾周 |
days(int) | 間隔幾天 |
hours(int) | 間隔幾小時(shí) |
minutes(int) | 間隔幾分鐘 |
seconds(int) | 間隔多少秒 |
start_date(datetime or str) | 開始日期 |
end_date(datetime or str) | 結(jié)束日期 |
timezone(datetime.tzinfo or str) | 時(shí)區(qū) |
from datetime import datetime from apscheduler.schedulers.blocking import BlockingScheduler def job_func(): print("當(dāng)前時(shí)間:", datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S.%f") scheduler = BlockingScheduler() # 每2小時(shí)觸發(fā) scheduler.add_job(job_func, 'interval', hours=2) # 在 2019-04-15 17:00:00 ~ 2019-12-31 24:00:00 之間, 每隔兩分鐘執(zhí)行一次 job_func 方法 scheduler .add_job(job_func, 'interval', minutes=2, start_date='2022-04-29 17:00:00' , end_date='2022-12-31 24:00:00') scheduler.start()
jitter振動(dòng)參數(shù),給每次觸發(fā)添加一個(gè)隨機(jī)浮動(dòng)秒數(shù),一般適用于多服務(wù)器,避免同時(shí)運(yùn)行造成服務(wù)擁堵。
# 每小時(shí)(上下浮動(dòng)120秒?yún)^(qū)間內(nèi))運(yùn)行`job_function` scheduler.add_job(job_func, 'interval', hours=1, jitter=120)
2.3 cron觸發(fā)器
在特定時(shí)間周期性地觸發(fā),和Linux crontab格式兼容。它是功能最強(qiáng)大的觸發(fā)器。
cron 參數(shù):
參數(shù) | 說(shuō)明 |
year(int or str) | 年,4位數(shù)字 |
month(int or str) | 月(范圍1-12) |
day(int or str) | 日(范圍1-31) |
week(int or str) | 周(范圍1-53) |
day_of_week(int or str) | 周內(nèi)第幾天或者星期幾(范圍0-6或者mon,tue,wed,thu,fri,stat,sun) |
hour(int or str) | 時(shí)(0-23) |
minute(int or str) | 分(0-59) |
second(int or str) | 秒(0-59) |
start_date(datetime or str) | 最早開始日期(含) |
end_date(datetime or str) | 最晚結(jié)束日期(含) |
timezone(datetime.tzinfo or str) | 指定時(shí)區(qū) |
表達(dá)式類型
表達(dá)式 | 參數(shù)類型 | 描述 |
---|---|---|
* | 所有 | 通配符。例:minutes=* 即每分鐘觸發(fā) |
*/a | 所有 | 可被a整除的通配符。 |
a-b | 所有 | 范圍a-b觸發(fā) |
a-b/c | 所有 | 范圍a-b,且可被c整除時(shí)觸發(fā) |
xth y | 日 | 第幾個(gè)星期幾觸發(fā)。x為第幾個(gè),y為星期幾 |
last x | 日 | 一個(gè)月中,最后的星期幾觸發(fā) |
last | 日 | 一個(gè)月最后一天觸發(fā) |
x,y,z | 所有 | 組合表達(dá)式,可以組合確定值或上方的表達(dá)式 |
import datetime from apscheduler.schedulers.background import BackgroundScheduler def job_func(text): print("當(dāng)前時(shí)間:", datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]) scheduler = BackgroundScheduler() # 在每年 1-3、7-9 月份中的每個(gè)星期一、二中的 00:00, 01:00, 02:00 和 03:00 執(zhí)行 job_func 任務(wù) scheduler .add_job(job_func, 'cron', month='1-3,7-9',day='0, tue', hour='0-3') scheduler.start()
參考:
python定時(shí)任務(wù)最強(qiáng)框架APScheduler詳細(xì)教程
python 定時(shí)任務(wù)APScheduler 使用介紹
Python定時(shí)庫(kù)APScheduler原理及用法
到此這篇關(guān)于Python定時(shí)任務(wù)框架APScheduler安裝使用詳解的文章就介紹到這了,更多相關(guān)Python定時(shí)任務(wù)APScheduler內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python列表嵌套引發(fā)的問(wèn)題總結(jié)
這篇文章主要介紹了python列表嵌套引發(fā)的問(wèn)題總結(jié),下面問(wèn)文章引發(fā)問(wèn)題來(lái)自日常工作總結(jié),具有一定的參考價(jià)值需要的小伙伴可以參考一下2022-05-05Python自動(dòng)巡檢H3C交換機(jī)實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了Python自動(dòng)巡檢H3C交換機(jī)實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08Python3爬蟲學(xué)習(xí)之爬蟲利器Beautiful Soup用法分析
這篇文章主要介紹了Python3爬蟲學(xué)習(xí)之爬蟲利器Beautiful Soup用法,結(jié)合實(shí)例形式分析了Beautiful Soup的功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2018-12-12如何使用Python的Requests包實(shí)現(xiàn)模擬登陸
這篇文章主要為大家詳細(xì)介紹了使用Python的Requests包模擬登陸,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04使用Python實(shí)現(xiàn)簡(jiǎn)單的爬蟲框架
爬蟲是一種自動(dòng)獲取網(wǎng)頁(yè)內(nèi)容的程序,它可以幫助我們從網(wǎng)絡(luò)上快速收集大量信息。下面我們將學(xué)習(xí)如何使用 Python 編寫一個(gè)簡(jiǎn)單的爬蟲框架,感興趣的可以了解一下2023-05-0550行Python代碼實(shí)現(xiàn)人臉檢測(cè)功能
現(xiàn)在的人臉識(shí)別技術(shù)已經(jīng)得到了非常廣泛的應(yīng)用,支付領(lǐng)域、身份驗(yàn)證、美顏相機(jī)里都有它的應(yīng)用。下面小編給大家?guī)?lái)了基于50行Python代碼實(shí)現(xiàn)人臉檢測(cè)功能,一起看看吧2018-01-01Python人工智能學(xué)習(xí)PyTorch實(shí)現(xiàn)WGAN示例詳解
這篇文章主要為大家介紹了人工智能學(xué)習(xí)PyTorch實(shí)現(xiàn)WGAN的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11Python+PyQt5+MySQL實(shí)現(xiàn)天氣管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Python+PyQt5+MySQL實(shí)現(xiàn)天氣管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06python超詳細(xì)實(shí)現(xiàn)字體反爬流程
大家好,本篇文章主要講的是python查策網(wǎng)字體反爬實(shí)例,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-05-05