Python輕量級(jí)定時(shí)任務(wù)調(diào)度APScheduler的使用
簡(jiǎn)述
APscheduler (Advanced Python Scheduler),作用為按指定的時(shí)間規(guī)則執(zhí)行指定的作業(yè)。提供了基于日期date、固定時(shí)間間隔interval 、以及類似于Linux上的定時(shí)任務(wù)crontab類型的定時(shí)任務(wù)。該框架不僅可以添加、刪除定時(shí)任務(wù),還可以將任務(wù)存儲(chǔ)到數(shù)據(jù)庫中,實(shí)現(xiàn)任務(wù)的持久化。
pip install apscheduler
APScheduler 有四種組件及相關(guān)說明:
1) triggers(觸發(fā)器):觸發(fā)器包含調(diào)度邏輯,每一個(gè)作業(yè)有它自己的觸發(fā)器,用于決定接下來哪一個(gè)作業(yè)會(huì)運(yùn)行,除了他們自己初始化配置外,觸發(fā)器完全是無狀態(tài)的。
2)job stores(作業(yè)存儲(chǔ)):用來存儲(chǔ)被調(diào)度的作業(yè),默認(rèn)的作業(yè)存儲(chǔ)器是簡(jiǎn)單地把作業(yè)任務(wù)保存在內(nèi)存中,其它作業(yè)存儲(chǔ)器可以將任務(wù)作業(yè)保存到各種數(shù)據(jù)庫中,支持MongoDB、Redis、SQLAlchemy 存儲(chǔ)方式。當(dāng)對(duì)作業(yè)任務(wù)進(jìn)行持久化存儲(chǔ)的時(shí)候,作業(yè)的數(shù)據(jù)將被序列化,重新讀取作業(yè)時(shí)在反序列化。
3) executors(執(zhí)行器):執(zhí)行器用來執(zhí)行定時(shí)任務(wù),只是將需要執(zhí)行的任務(wù)放在新的線程或者線程池中運(yùn)行。當(dāng)作業(yè)任務(wù)完成時(shí),執(zhí)行器將會(huì)通知調(diào)度器。對(duì)于執(zhí)行器,默認(rèn)情況下選擇ThreadPoolExecutor就可以了,但是如果涉及到一下特殊任務(wù)如比較消耗CPU的任務(wù)則可以選擇ProcessPoolExecutor,當(dāng)然根據(jù)根據(jù)實(shí)際需求可以同時(shí)使用兩種執(zhí)行器。
4) schedulers(調(diào)度器):調(diào)度器是將其它部分聯(lián)系在一起,一般在應(yīng)用程序中只有一個(gè)調(diào)度器,應(yīng)用開發(fā)者不會(huì)直接操作觸發(fā)器、任務(wù)存儲(chǔ)以及執(zhí)行器,相反調(diào)度器提供了處理的接口。通過調(diào)度器完成任務(wù)的存儲(chǔ)以及執(zhí)行器的配置操作,如可以添加。修改、移除任務(wù)作業(yè)。
APScheduler提供了多種調(diào)度器,可以根據(jù)具體需求來選擇合適的調(diào)度器,常用的調(diào)度器有:
- BlockingScheduler:適合于只在進(jìn)程中運(yùn)行單個(gè)任務(wù)的情況,通常在調(diào)度器是你唯一要運(yùn)行的東西時(shí)使用。
- BackgroundScheduler: 適合于要求任何在程序后臺(tái)運(yùn)行的情況,當(dāng)希望調(diào)度器在應(yīng)用后臺(tái)執(zhí)行時(shí)使用。
- AsyncIOScheduler:適合于使用 asyncio 框架的情況
- GeventScheduler: 適合于使用gevent框架的情況
- TornadoScheduler: 適合于使用 Tornado 框架的應(yīng)用
- TwistedScheduler: 適合使用Twisted框架的應(yīng)用
- QtScheduler: 適合使用QT的情況
例子
定時(shí)執(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ā)器
詳細(xì)說明
Job 作業(yè)
Job 是 APScheduler 最小執(zhí)行單位。創(chuàng)建 Job 時(shí)指定執(zhí)行的函數(shù),函數(shù)中所需參數(shù),Job 執(zhí)行時(shí)的一些設(shè)置信息。
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來計(jì)算執(zhí)行次數(shù),根據(jù)設(shè)置的最大實(shí)例數(shù) 來確定是否可執(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ū)е?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ò)過了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ù)
Trigger 觸發(fā)器
包含調(diào)度邏輯,每一個(gè)作業(yè)有它自己的觸發(fā)器,用于決定接下來哪一個(gè)作業(yè)會(huì)運(yùn)行。除了它們自己初始配置以外,觸發(fā)器完全是無狀態(tài)的【說人話就是,這個(gè)調(diào)度邏輯只能創(chuàng)建時(shí)設(shè)置,創(chuàng)建好后無法修改調(diào)度邏輯】。
APScheduler 有三種內(nèi)建的 trigger:
- date: 特定的時(shí)間點(diǎn)觸發(fā)
- interval: 固定時(shí)間間隔觸發(fā)
- cron: 在特定時(shí)間周期性地觸發(fā)
Jobstore 作業(yè)存儲(chǔ)
如果有保存作業(yè)狀態(tài)的需求的話需要使用 Jobstore
如果你的應(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)境來選擇具體的作業(yè)存儲(chǔ)器。例如:使用Mongo或者SQLAlchemy JobStore (用于支持大多數(shù)RDBMS)。
Executor 執(zhí)行器
Executor在scheduler中初始化,另外也可通過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)度來選擇,如果選擇AsyncIO作為調(diào)度的庫,那么選擇AsyncIOExecutor,如果選擇tornado作為調(diào)度的庫,選擇TornadoExecutor,如果選擇啟動(dòng)進(jìn)程作為調(diào)度,選擇ThreadPoolExecutor或者ProcessPoolExecutor都可以。
Executor的選擇需要根據(jù)實(shí)際的scheduler來選擇不同的執(zhí)行器。
處理作業(yè)的運(yùn)行,它們通常通過在作業(yè)中提交制定的可調(diào)用對(duì)象到一個(gè)線程或者進(jìn)城池來進(jìn)行。當(dāng)作業(yè)完成時(shí),執(zhí)行器將會(huì)通知調(diào)度器。
Scheduler 調(diào)度器
一般只有一個(gè)調(diào)度器。
Reference
到此這篇關(guān)于Python輕量級(jí)定時(shí)任務(wù)調(diào)度APScheduler的使用的文章就介紹到這了,更多相關(guān)Python APScheduler內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
不同版本中Python matplotlib.pyplot.draw()界面繪制異常問題的解決
這篇文章主要給大家介紹了關(guān)于不同版本中Python matplotlib.pyplot.draw()界面繪制異常問題的解決方法,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-09-09Python3+PyCharm+Django+Django REST framework配置與簡(jiǎn)單開發(fā)教程
這篇文章主要介紹了Python3+PyCharm+Django+Django REST framework配置與簡(jiǎn)單開發(fā)教程,需要的朋友可以參考下2021-02-02用python寫個(gè)自動(dòng)SSH登錄遠(yuǎn)程服務(wù)器的小工具(實(shí)例)
下面小編就為大家?guī)硪黄胮ython寫個(gè)自動(dòng)SSH登錄遠(yuǎn)程服務(wù)器的小工具(實(shí)例)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06基于Python和TFIDF實(shí)現(xiàn)提取文本中的關(guān)鍵詞
TFIDF 的工作原理是按比例增加一個(gè)詞語在文檔中出現(xiàn)的次數(shù),但會(huì)被它所在的文檔數(shù)量抵消。本文將利用TFIDF實(shí)現(xiàn)提取文本中的關(guān)鍵詞,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧2022-04-04python中urllib.request和requests的使用及區(qū)別詳解
這篇文章主要介紹了python中urllib.request和requests的使用及區(qū)別詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05Python?數(shù)據(jù)庫操作SQL基礎(chǔ)
在本章節(jié)中,我們將討論?Python?數(shù)據(jù)庫操作的基礎(chǔ)知識(shí),重點(diǎn)關(guān)注?SQL即Structured?Query?Language,結(jié)構(gòu)化查詢語言,SQL?是用于管理關(guān)系型數(shù)據(jù)庫的標(biāo)準(zhǔn)編程語言,可以用來執(zhí)行數(shù)據(jù)定義、數(shù)據(jù)操作和數(shù)據(jù)控制等任務(wù)2023-06-06python中常用排序操作sort方法和sorted函數(shù)的使用超詳細(xì)講解(內(nèi)置模板代碼!)
這篇文章主要介紹了Python中的排序方法,包括sort()方法和sorted()函數(shù)的使用,sort()方法用于列表,對(duì)原列表進(jìn)行排序,文章還提供了一些排序案例模板代碼,以解決實(shí)際問題,需要的朋友可以參考下2025-02-02