Python輕量級定時任務調度APScheduler的使用
簡述
APscheduler (Advanced Python Scheduler),作用為按指定的時間規(guī)則執(zhí)行指定的作業(yè)。提供了基于日期date、固定時間間隔interval 、以及類似于Linux上的定時任務crontab類型的定時任務。該框架不僅可以添加、刪除定時任務,還可以將任務存儲到數(shù)據庫中,實現(xiàn)任務的持久化。
pip install apscheduler
APScheduler 有四種組件及相關說明:
1) triggers(觸發(fā)器):觸發(fā)器包含調度邏輯,每一個作業(yè)有它自己的觸發(fā)器,用于決定接下來哪一個作業(yè)會運行,除了他們自己初始化配置外,觸發(fā)器完全是無狀態(tài)的。
2)job stores(作業(yè)存儲):用來存儲被調度的作業(yè),默認的作業(yè)存儲器是簡單地把作業(yè)任務保存在內存中,其它作業(yè)存儲器可以將任務作業(yè)保存到各種數(shù)據庫中,支持MongoDB、Redis、SQLAlchemy 存儲方式。當對作業(yè)任務進行持久化存儲的時候,作業(yè)的數(shù)據將被序列化,重新讀取作業(yè)時在反序列化。
3) executors(執(zhí)行器):執(zhí)行器用來執(zhí)行定時任務,只是將需要執(zhí)行的任務放在新的線程或者線程池中運行。當作業(yè)任務完成時,執(zhí)行器將會通知調度器。對于執(zhí)行器,默認情況下選擇ThreadPoolExecutor就可以了,但是如果涉及到一下特殊任務如比較消耗CPU的任務則可以選擇ProcessPoolExecutor,當然根據根據實際需求可以同時使用兩種執(zhí)行器。
4) schedulers(調度器):調度器是將其它部分聯(lián)系在一起,一般在應用程序中只有一個調度器,應用開發(fā)者不會直接操作觸發(fā)器、任務存儲以及執(zhí)行器,相反調度器提供了處理的接口。通過調度器完成任務的存儲以及執(zhí)行器的配置操作,如可以添加。修改、移除任務作業(yè)。
APScheduler提供了多種調度器,可以根據具體需求來選擇合適的調度器,常用的調度器有:
- BlockingScheduler:適合于只在進程中運行單個任務的情況,通常在調度器是你唯一要運行的東西時使用。
- BackgroundScheduler: 適合于要求任何在程序后臺運行的情況,當希望調度器在應用后臺執(zhí)行時使用。
- AsyncIOScheduler:適合于使用 asyncio 框架的情況
- GeventScheduler: 適合于使用gevent框架的情況
- TornadoScheduler: 適合于使用 Tornado 框架的應用
- TwistedScheduler: 適合使用Twisted框架的應用
- QtScheduler: 適合使用QT的情況
例子
定時執(zhí)行函數(shù)test_job,每隔5秒鐘執(zhí)行一次
from apscheduler.schedulers.blocking import BlockingScheduler import time def test_job(): print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))) test_job() scheduler = BlockingScheduler() scheduler.add_job(test_job,'interval',seconds=5,id='test_job') scheduler.start()
每周星期一到星期五,下午13:00-19:00每分每4秒執(zhí)行一次
import datetime import time from apscheduler.schedulers.blocking import BlockingScheduler def job_function(): print("Hello World" + " " + str(datetime.datetime.now())) if __name__ == '__main__': print('start to do it') sched = BlockingScheduler() sched.add_job(job_function, 'cron', day_of_week='mon-fri', hour='13-19', minute="*", second="*/4") # 每4秒執(zhí)行一次 sched.start()
cron 觸發(fā)器
詳細說明
Job 作業(yè)
Job 是 APScheduler 最小執(zhí)行單位。創(chuàng)建 Job 時指定執(zhí)行的函數(shù),函數(shù)中所需參數(shù),Job 執(zhí)行時的一些設置信息。
id:指定作業(yè)的唯一ID name:指定作業(yè)的名字 trigger:apscheduler定義的觸發(fā)器,用于確定Job的執(zhí)行時間,根據設置的trigger規(guī)則,計算得到下次執(zhí)行此job的時間, 滿足時將會執(zhí)行 executor:apscheduler定義的執(zhí)行器,job創(chuàng)建時設置執(zhí)行器的名字,根據字符串你名字到scheduler獲取到執(zhí)行此 job的 執(zhí)行器,執(zhí)行job指定的函數(shù) max_instances:執(zhí)行此job的最大實例數(shù),executor執(zhí)行job時,根據job的id來計算執(zhí)行次數(shù),根據設置的最大實例數(shù) 來確定是否可執(zhí)行 next_run_time:Job下次的執(zhí)行時間,創(chuàng)建Job時可以指定一個時間[datetime],不指定的話則默認根據trigger獲取觸 發(fā)時間 misfire_grace_time:Job的延遲執(zhí)行時間,例如Job的計劃執(zhí)行時間是21:00:00,但因服務重啟或其他原因導致 21:00:31才執(zhí)行,如果設置此key為40,則該job會繼續(xù)執(zhí)行,否則將會丟棄此job coalesce:Job是否合并執(zhí)行,是一個bool值。例如scheduler停止20s后重啟啟動,而job的觸發(fā)器設置為5s執(zhí)行一次,因此此job錯過了4個執(zhí)行時間,如果設置為是,則會合并到一次執(zhí)行,否則會逐個執(zhí)行 func:Job執(zhí)行的函數(shù) args:Job執(zhí)行函數(shù)需要的位置參數(shù) kwargs:Job執(zhí)行函數(shù)需要的關鍵字參數(shù)
Trigger 觸發(fā)器
包含調度邏輯,每一個作業(yè)有它自己的觸發(fā)器,用于決定接下來哪一個作業(yè)會運行。除了它們自己初始配置以外,觸發(fā)器完全是無狀態(tài)的【說人話就是,這個調度邏輯只能創(chuàng)建時設置,創(chuàng)建好后無法修改調度邏輯】。
APScheduler 有三種內建的 trigger:
- date: 特定的時間點觸發(fā)
- interval: 固定時間間隔觸發(fā)
- cron: 在特定時間周期性地觸發(fā)
Jobstore 作業(yè)存儲
如果有保存作業(yè)狀態(tài)的需求的話需要使用 Jobstore
如果你的應用在每次啟動的時候都會重新創(chuàng)建作業(yè),那么使用默認的作業(yè)存儲器(MemoryJobStore)即可,但是如果你需要在調度器重啟或者應用程序奔潰的情況下任然保留作業(yè),你應該根據你的應用環(huán)境來選擇具體的作業(yè)存儲器。例如:使用Mongo或者SQLAlchemy JobStore (用于支持大多數(shù)RDBMS)。
Executor 執(zhí)行器
Executor在scheduler中初始化,另外也可通過scheduler的add_executor動態(tài)添加Executor。
每個executor都會綁定一個alias,這個作為唯一標識綁定到Job,在實際執(zhí)行時會根據Job綁定的executor。找到實際的執(zhí)行器對象,然后根據執(zhí)行器對象執(zhí)行Job。
Executor的種類會根據不同的調度來選擇,如果選擇AsyncIO作為調度的庫,那么選擇AsyncIOExecutor,如果選擇tornado作為調度的庫,選擇TornadoExecutor,如果選擇啟動進程作為調度,選擇ThreadPoolExecutor或者ProcessPoolExecutor都可以。
Executor的選擇需要根據實際的scheduler來選擇不同的執(zhí)行器。
處理作業(yè)的運行,它們通常通過在作業(yè)中提交制定的可調用對象到一個線程或者進城池來進行。當作業(yè)完成時,執(zhí)行器將會通知調度器。
Scheduler 調度器
一般只有一個調度器。
Reference
到此這篇關于Python輕量級定時任務調度APScheduler的使用的文章就介紹到這了,更多相關Python APScheduler內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
不同版本中Python matplotlib.pyplot.draw()界面繪制異常問題的解決
這篇文章主要給大家介紹了關于不同版本中Python matplotlib.pyplot.draw()界面繪制異常問題的解決方法,文中介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。2017-09-09Python3+PyCharm+Django+Django REST framework配置與簡單開發(fā)教程
這篇文章主要介紹了Python3+PyCharm+Django+Django REST framework配置與簡單開發(fā)教程,需要的朋友可以參考下2021-02-02基于Python和TFIDF實現(xiàn)提取文本中的關鍵詞
TFIDF 的工作原理是按比例增加一個詞語在文檔中出現(xiàn)的次數(shù),但會被它所在的文檔數(shù)量抵消。本文將利用TFIDF實現(xiàn)提取文本中的關鍵詞,感興趣的小伙伴快跟隨小編一起學習一下吧2022-04-04python中urllib.request和requests的使用及區(qū)別詳解
這篇文章主要介紹了python中urllib.request和requests的使用及區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05python中常用排序操作sort方法和sorted函數(shù)的使用超詳細講解(內置模板代碼!)
這篇文章主要介紹了Python中的排序方法,包括sort()方法和sorted()函數(shù)的使用,sort()方法用于列表,對原列表進行排序,文章還提供了一些排序案例模板代碼,以解決實際問題,需要的朋友可以參考下2025-02-02