最新Python?APScheduler?定時任務(wù)詳解
一、基本概念
APScheduler
全稱Advanced Python Scheduler
作用為在指定的時間規(guī)則執(zhí)行指定的作業(yè)。
- 指定時間規(guī)則的方式可以是間隔多久執(zhí)行,可以是指定日期時間的執(zhí)行,也可以類似Linux系統(tǒng)中Crontab中的方式執(zhí)行任務(wù)。
- 指定的任務(wù)就是一個Python函數(shù)。
1.1、 觸發(fā)器:triggers
用于設(shè)定觸發(fā)任務(wù)的條件:
觸發(fā)器包含調(diào)度邏輯。每個任務(wù)都有自己的觸發(fā)器,用于確定何時應(yīng)該運行作業(yè)。除了初始配置之外,觸發(fā)器完全是無狀態(tài)的
1.2、作業(yè)存儲器:job stores
用于存放任務(wù),把任務(wù)存放在內(nèi)存或數(shù)據(jù)庫中
- 默認情況下,任務(wù)存放在內(nèi)存中。也可以配置存放在不同類型的數(shù)據(jù)庫中。如果任務(wù)存放在數(shù)據(jù)庫中,那么任務(wù)的存取有一個序列化和反序列化的過程,同時修改和搜索任務(wù)的功能也是由任務(wù)儲存器實現(xiàn)。
- 注意一個任務(wù)儲存器不要共享給多個調(diào)度器,否則會導(dǎo)致狀態(tài)混亂
1.3、執(zhí)行器 executors
用于執(zhí)行任務(wù),可以設(shè)定執(zhí)行模式為單線程或線程池:
任務(wù)會被執(zhí)行器放入線程池或進程池去執(zhí)行,執(zhí)行完畢后,執(zhí)行器會通知調(diào)度器。
1.4、調(diào)度器 schedulers
把上方三個組件作為參數(shù),通過創(chuàng)建調(diào)度器實例來運行:
一個調(diào)度器由上方三個組件構(gòu)成,一般來說,一個程序只要有一個調(diào)度器就可以了。開發(fā)者也不必直接操作任務(wù)儲存器、執(zhí)行器以及觸發(fā)器,因為調(diào)度器提供了統(tǒng)一的接口,通過調(diào)度器就可以操作組件,比如任務(wù)的增刪改查。
二、調(diào)度器詳解
BlockingScheduler
: 阻塞式調(diào)度器:適用于只跑調(diào)度器的程序。BackgroundScheduler
: 后臺調(diào)度器:適用于非阻塞的情況,調(diào)度器會在后臺獨立運行AsyncIOScheduler
: AsyncIO調(diào)度器,適用于應(yīng)用使用AsnycIO的情況。GeventScheduler
: Gevent調(diào)度器,適用于應(yīng)用通過Gevent的情況。TornadoScheduler
: Tornado調(diào)度器,適用于構(gòu)建Tornado應(yīng)用。TwistedScheduler
:Twisted調(diào)度器,適用于構(gòu)建Twisted應(yīng)用。QtScheduler
: Qt調(diào)度器,適用于構(gòu)建Qt應(yīng)用。
2.1、APScheduler有三種內(nèi)置的觸發(fā)器
date
:日期:觸發(fā)任務(wù)運行的具體日期interval
: 間隔:觸發(fā)任務(wù)運行的時間間隔cron
: 周期:觸發(fā)任務(wù)運行的周期
2.2、觸發(fā)器公共參數(shù)
id
:啟動任務(wù)的ID具有唯一性name
: 設(shè)置啟動任務(wù)的名稱coalesce
:當(dāng)由于某種原因?qū)е履硞€job積攢了好幾次沒有實際運行(比如說系統(tǒng)掛了5分鐘后恢復(fù),有一個任務(wù)是每分鐘跑一次的,按道理說這5分鐘內(nèi)本來是“計劃”運行5次的,但實際沒有執(zhí)行),如果coalesce為True,下次這個job被submit給executor時,只會執(zhí)行1次,也就是最后這次,如果為False,那么會執(zhí)行5次(不一定,因為還有其他條件,看后面misfire_grace_time的解釋)max_instance
: 就是說同一個job同一時間最多有幾個實例再跑,比如一個耗時10分鐘的job,被指定每分鐘運行1次,如果我們max_instance值為5,那么在第6~10分鐘上,新的運行實例不會被執(zhí)行,因為已經(jīng)有5個實例在跑了misfire_grace_time
:設(shè)想和上述coalesce類似的場景,如果一個job本來14:00有一次執(zhí)行,但是由于某種原因沒有被調(diào)度上,現(xiàn)在14:01了,這個14:00的運行實例被提交時,會檢查它預(yù)訂運行的時間和當(dāng)下時間的差值(這里是1分鐘),大于我們設(shè)置的30秒限制,那么這個運行實例不會被執(zhí)行。replace_existing
: 如果調(diào)度的job在一個持久化的存儲器里,當(dāng)初始化應(yīng)用程序時,必須要為job定義一個顯示的ID并使用replace_existing=True
, 否則每次應(yīng)用程序重啟時都會得到那個job的一個新副本
2.3、date內(nèi)置觸發(fā)器
date 是最基本的一種調(diào)度,作業(yè)任務(wù)只會執(zhí)行一次。它表示特定的時間點觸發(fā)。它的參數(shù)如下:
參數(shù) | 說明 |
---|---|
run_date (datetime 或 str) | 作業(yè)的運行日期或時間 |
timezone (datetime.tzinfo 或 str) | 指定時區(qū) |
from datetime import datetime from datetime import date from apscheduler.schedulers.blocking import BlockingScheduler def job(text): print(text) scheduler = BlockingScheduler() # 在 2019-8-30 運行一次 job 方法 scheduler.add_job(job, 'date', run_date=date(2022, 4, 9), args=['text1'], id="1", coalesce=True, max_instances=1) # 在 2019-8-30 01:00:00 運行一次 job 方法 scheduler.add_job(job, 'date', run_date=datetime(2022, 4, 9, 17, 40, 58), args=['text2'], id="2", coalesce=True, max_instances=1) # 在 2019-8-30 01:00:01 運行一次 job 方法 scheduler.add_job(job, 'date', run_date='2022-4-9 17:41:00', args=['text3'], id="3", coalesce=True, max_instances=1) scheduler.start()
2.4、interval 周期觸發(fā)任務(wù)
參數(shù) | 說明 |
---|---|
weeks (int) | 間隔幾周 |
days (int) | 間隔幾天 |
hours (int) | 間隔幾小時 |
minutes (int) | 間隔幾分鐘 |
seconds (int) | 間隔多少秒 |
start_date (datetime 或 str) | 開始日期 |
end_date (datetime 或 str) | 結(jié)束日期 |
timezone (datetime.tzinfo 或str) | 時區(qū) |
@sched.scheduled_job( "interval", id=spider_job_name + "_bg_data", coalesce=True, max_instances=1, minutes=20 ) def tick_rzjg_detail_xq(): """ 快速完成 :return: """ each = "rzjg_bg_data" cmd_str = f"cd {ROOT} && bash run_spider.sh {each} --loglevel=INFO" print(cmd_str) os.system(cmd_str) def func(): print("Press Ctrl+C to exit") # 直接觸發(fā)一次 tick_rzjg_detail_xq() try: sched.start() except (KeyboardInterrupt, SystemExit): pass if __name__ == "__main__": func()
2.5、cron 觸發(fā)器 在特定時間周期性地觸發(fā),和Linux crontab格式兼容。
它是功能最強大的觸發(fā)器
參數(shù) | 說明 |
---|---|
year (int 或 str) | 年,4位數(shù)字 |
month (int 或 str) | 月 (范圍1-12) |
day (int 或 str) | 日 (范圍1-31) |
week (int 或 str) | 周 (范圍1-53) |
day_of_week (int 或 str) | 周內(nèi)第幾天或者星期幾 (范圍0-6 或者 mon,tue,wed,thu,fri,sat,sun) |
hour (int 或 str) | 時 (范圍0-23) |
minute (int 或 str) | 分 (范圍0-59) |
second (int 或 str) | 秒 (范圍0-59) |
start_date (datetime 或 str) | 最早開始日期(包含) |
end_date (datetime 或 str) | 最晚結(jié)束時間(包含) |
timezone (datetime.tzinfo 或str) | 指定時區(qū) |
表達式 | 參數(shù)類型 | 描述 |
---|---|---|
* | 所有 | 通配符。例:minutes=*即每分鐘觸發(fā) |
*/a | 所有 | 可被a整除的通配符 |
a-b | 所有 | 范圍a-b觸發(fā) |
a-b/c | 所有 | 范圍a-b,且可被c整除時觸發(fā) |
xth y | 日 | 第幾個星期幾觸發(fā)。x為第幾個,y為星期幾 |
last x | 日 | 一個月中,最后個星期幾觸發(fā) |
last | 日 | 一個月最后一天觸發(fā) |
x,y,z | 所有 | 組合表達式,可以組合確定值或上方的表達式 |
import time from apscheduler.schedulers.blocking import BlockingScheduler def job(text): t = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) print('{} --- {}'.format(text, t)) scheduler = BlockingScheduler() # 在每天22點,每隔 1分鐘 運行一次 job 方法 scheduler.add_job(job, 'cron', hour=22, minute='*/1', args=['job1']) # 在每天22和23點的25分,運行一次 job 方法 scheduler.add_job(job, 'cron', hour='22-23', minute='25', args=['job2']) # 在每天 8 點,運行一次 job 方法 scheduler.add_job(job, 'cron', hour='8', args=['job2']) # 在每天 8 點 20點,各運行一次 job 方法 設(shè)置最大運行實例數(shù) scheduler.add_job(job, 'cron', hour='8, 20', minute=30, max_instances=4) scheduler.start()
到此這篇關(guān)于Python APScheduler 定時任務(wù)詳解的文章就介紹到這了,更多相關(guān)Python APScheduler 定時任務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python APScheduler執(zhí)行使用方法詳解
- python 基于Apscheduler實現(xiàn)定時任務(wù)
- Python定時庫Apscheduler的簡單使用
- python定時任務(wù)apscheduler的詳細使用教程
- python?包之?APScheduler?定時任務(wù)
- Python flask框架定時任務(wù)apscheduler應(yīng)用介紹
- Python實現(xiàn)定時任務(wù)利器之a(chǎn)pscheduler使用詳解
- Python高效定時任務(wù)處理APScheduler庫深入學(xué)習(xí)
- Python apscheduler實現(xiàn)定時任務(wù)的方法詳解
- Python輕量級定時任務(wù)調(diào)度APScheduler的使用
相關(guān)文章
使用Python根據(jù)一個列表的順序?qū)ζ渌斜磉M行排序
這篇文章主要介紹了使用Python根據(jù)一個列表的順序?qū)ζ渌斜磉M行排序,根據(jù)列表B中每個元素的下標(biāo)來獲取列表A中對應(yīng)位置的元素,將其作為排序依據(jù)即可,需要的朋友可以參考下2023-10-10解決Python訪問MySQL數(shù)據(jù)庫速度慢的問題
這篇文章主要介紹了解決Python訪問MySQL數(shù)據(jù)庫速度慢的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04