asp python 定时任务_python定时任务最强框架APScheduler详细教程
APScheduler定時(shí)任務(wù)
上次測試女神聽了我的建議,已經(jīng)做好了要給項(xiàng)目添加定時(shí)任務(wù)的決定了。但是之前提供的四種方式中,她不知道具體選擇哪一個(gè)。為了和女神更近一步,我把我入行近10年收藏的干貨免費(fèi)拿出來分享給女神,希望女神凌晨2點(diǎn)再找我的時(shí)候,不再是因?yàn)橐o他調(diào)程序了。
Python中定時(shí)任務(wù)的解決方案,總體來說有四種,分別是:crontab、 scheduler、 Celery、 APScheduler,其中 crontab不適合多臺(tái)服務(wù)器的配置、scheduler太過于簡單、 Celery依賴的軟件比較多,比較耗資源。最好的解決方案就是 APScheduler。
APScheduler使用起來十分方便。提供了基于日期、固定時(shí)間間隔以及 crontab類型的任務(wù)。還可以在程序運(yùn)行過程中動(dòng)態(tài)的新增任務(wù)和刪除任務(wù)。在任務(wù)運(yùn)行過程中,還可以把任務(wù)存儲(chǔ)起來,下次啟動(dòng)運(yùn)行依然保留之前的狀態(tài)。另外最重要的一個(gè)特點(diǎn)是,因?yàn)樗腔?Python語言的庫,所以是可以跨平臺(tái)的,一段代碼,處處運(yùn)行!
在這里我來給大家詳細(xì)介紹一下具體的用法。
一、安裝:
安裝非常簡單,通過 pip install apscheduler即可。
二、基本使用:
先來看一段代碼,然后再來給大家詳細(xì)講解其中的細(xì)節(jié):
其中 BlockingScheduler是阻塞性的調(diào)度器,是最基本的調(diào)度器,下面調(diào)用 start方法就會(huì)阻塞當(dāng)前進(jìn)程,所以如果你的程序除了調(diào)度進(jìn)程沒有其他后臺(tái)進(jìn)程,那么是可以是否的,否則這個(gè)調(diào)度器會(huì)阻塞你程序的正常執(zhí)行。
接下來就是定義一個(gè) my_clock函數(shù),這個(gè)函數(shù)就是需要定時(shí)調(diào)度的任務(wù)代碼。
然后就是實(shí)例化一個(gè) BlockingScheduler對(duì)象,并把 my_clock添加到任務(wù)調(diào)度中。然后看 interval參數(shù),這里用的是間隔的方式來調(diào)度,調(diào)度頻率是 seconds=3,也就是每3秒執(zhí)行一次。
執(zhí)行結(jié)果如下:
可以看到每隔3秒鐘的時(shí)間會(huì)執(zhí)行一次。說明定時(shí)任務(wù)已經(jīng)成功執(zhí)行了!
在了解了 APScheduler的基本使用后,再來對(duì) APScheduler的四個(gè)基本對(duì)象做個(gè)了解,這樣才能從全局掌握 APScheduler。
三、四個(gè)基本對(duì)象:
1. 觸發(fā)器(triggers):
觸發(fā)器就是根據(jù)你指定的觸發(fā)方式,比如是按照時(shí)間間隔,還是按照 crontab觸發(fā),觸發(fā)條件是什么等。每個(gè)任務(wù)都有自己的觸發(fā)器。
2. 任務(wù)存儲(chǔ)器(job stores):
任務(wù)存儲(chǔ)器是可以存儲(chǔ)任務(wù)的地方,默認(rèn)情況下任務(wù)保存在內(nèi)存,也可將任務(wù)保存在各種數(shù)據(jù)庫中。任務(wù)存儲(chǔ)進(jìn)去后,會(huì)進(jìn)行序列化,然后也可以反序列化提取出來,繼續(xù)執(zhí)行。
3. 執(zhí)行器(executors):
執(zhí)行器的目的是安排任務(wù)到線程池或者進(jìn)程池中運(yùn)行的。
4. 調(diào)度器(schedulers):
任務(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)來實(shí)現(xiàn)了。
四、觸發(fā)器:
觸發(fā)器有兩種,第一種是 interval,第二種是 crontab。interval可以具體指定多少時(shí)間間隔執(zhí)行一次。crontab可以指定執(zhí)行的日期策略。以下分別進(jìn)行講解。
1. date觸發(fā)器:
在某個(gè)日期時(shí)間只觸發(fā)一次事件。示例代碼如下:
更多請(qǐng)參考:https://apscheduler.readthedocs.io/en/stable/modules/triggers/date.html
2. interval觸發(fā)器:
想要在固定的時(shí)間間隔觸發(fā)事件。interval的觸發(fā)器可以設(shè)置以下的觸發(fā)參數(shù):
weeks:周。整形。
days:一個(gè)月中的第幾天。整形。
hours:小時(shí)。整形。
minutes:分鐘。整形。
seconds:秒。整形。
start_date:間隔觸發(fā)的起始時(shí)間。
end_date:間隔觸發(fā)的結(jié)束時(shí)間。
jitter:觸發(fā)的時(shí)間誤差。
在每天的11點(diǎn)24分觸發(fā)事件。更多請(qǐng)參考:https://apscheduler.readthedocs.io/en/stable/modules/triggers/interval.html
3. crontab觸發(fā)器:
在某個(gè)確切的時(shí)間周期性的觸發(fā)事件。可以使用的參數(shù)如下:
year:4位數(shù)字的年份。
month:1-12月份。
day:1-31日。
week:1-53周。
day_of_week:一個(gè)禮拜中的第幾天( 0-6或者 mon、 tue、 wed、 thu、 fri、 sat、 sun)。
hour: 0-23小時(shí)。
minute: 0-59分鐘。
second: 0-59秒。
start_date: datetime類型或者字符串類型,起始時(shí)間。
end_date: datetime類型或者字符串類型,結(jié)束時(shí)間。
timezone:時(shí)區(qū)。
jitter:任務(wù)觸發(fā)的誤差時(shí)間。
也可以用表達(dá)式類型,可以用以下方式:
示例如下:
五、調(diào)度器:
BlockingScheduler:適用于調(diào)度程序是進(jìn)程中唯一運(yùn)行的進(jìn)程,調(diào)用 start函數(shù)會(huì)阻塞當(dāng)前線程,不能立即返回。
BackgroundScheduler:適用于調(diào)度程序在應(yīng)用程序的后臺(tái)運(yùn)行,調(diào)用 start后主線程不會(huì)阻塞。
AsyncIOScheduler:適用于使用了 asyncio模塊的應(yīng)用程序。
GeventScheduler:適用于使用 gevent模塊的應(yīng)用程序。
TwistedScheduler:適用于構(gòu)建 Twisted的應(yīng)用程序。
QtScheduler:適用于構(gòu)建 Qt的應(yīng)用程序。
六、任務(wù)存儲(chǔ)器:
任務(wù)存儲(chǔ)器的選擇有兩種。一是內(nèi)存,也是默認(rèn)的配置。二是數(shù)據(jù)庫。使用內(nèi)存的方式是簡單高效,但是不好的是,一旦程序出現(xiàn)問題,重新運(yùn)行的話,會(huì)把之前已經(jīng)執(zhí)行了的任務(wù)重新執(zhí)行一遍。數(shù)據(jù)庫則可以在程序崩潰后,重新運(yùn)行可以從之前中斷的地方恢復(fù)正常運(yùn)行。有以下幾種選擇:
MemoryJobStore:沒有序列化,任務(wù)存儲(chǔ)在內(nèi)存中,增刪改查都是在內(nèi)存中完成。
SQLAlchemyJobStore:使用 SQLAlchemy這個(gè) ORM框架作為存儲(chǔ)方式。
MongoDBJobStore:使用 mongodb作為存儲(chǔ)器。
RedisJobStore:使用 redis作為存儲(chǔ)器。
七、執(zhí)行器:
執(zhí)行器的選擇取決于應(yīng)用場景。通常默認(rèn)的 ThreadPoolExecutor已經(jīng)在大部分情況下是可以滿足我們需求的。如果我們的任務(wù)涉及到一些 CPU密集計(jì)算的操作。那么應(yīng)該考慮 ProcessPoolExecutor。然后針對(duì)每種程序, apscheduler也設(shè)置了不同的 executor:
ThreadPoolExecutor:線程池執(zhí)行器。
ProcessPoolExecutor:進(jìn)程池執(zhí)行器。
GeventExecutor: Gevent程序執(zhí)行器。
TornadoExecutor: Tornado程序執(zhí)行器。
TwistedExecutor: Twisted程序執(zhí)行器。
AsyncIOExecutor: asyncio程序執(zhí)行器。
八、定時(shí)任務(wù)調(diào)度配置:
這里我們用一個(gè)例子來說明。比如我想這樣配置
執(zhí)行器:
配置 default執(zhí)行器為 ThreadPoolExecutor,并且設(shè)置最多的線程數(shù)是20個(gè)。
<
存儲(chǔ)器:
配置 default的任務(wù)存儲(chǔ)器為 SQLAlchemyJobStore(使用SQLite)。
<
任務(wù)配置:
設(shè)置 coalesce為 False:設(shè)置這個(gè)目的是,比如由于某個(gè)原因?qū)е履硞€(gè)任務(wù)積攢了很多次沒有執(zhí)行(比如有一個(gè)任務(wù)是1分鐘跑一次,但是系統(tǒng)原因斷了5分鐘),如果 coalesce=True,那么下次恢復(fù)運(yùn)行的時(shí)候,會(huì)只執(zhí)行一次,而如果設(shè)置 coalesce=False,那么就不會(huì)合并,會(huì)5次全部執(zhí)行。
max_instances=5:同一個(gè)任務(wù)同一時(shí)間最多只能有5個(gè)實(shí)例在運(yùn)行。比如一個(gè)耗時(shí)10分鐘的job,被指定每分鐘運(yùn)行1次,如果我 max_instance值5,那么在第6~10分鐘上,新的運(yùn)行實(shí)例不會(huì)被執(zhí)行,因?yàn)橐呀?jīng)有5個(gè)實(shí)例在跑了。
那么代碼如下:
九、任務(wù)操作:
1. 添加任務(wù):
使用 scheduler.add_job(job_obj,args,id,trigger,**trigger_kwargs)。
2. 刪除任務(wù):
使用 scheduler.remove_job(job_id,jobstore=None)。
3. 暫停任務(wù):
使用 scheduler.pause_job(job_id,jobstore=None)。
4. 恢復(fù)任務(wù):
使用 scheduler.resume_job(job_id,jobstore=None)。
5. 修改某個(gè)任務(wù)屬性信息:
使用 scheduler.modify_job(job_id,jobstore=None,**changes)。
6. 修改單個(gè)作業(yè)的觸發(fā)器并更新下次運(yùn)行時(shí)間:
使用 scheduler.reschedule_job(job_id,jobstore=None,trigger=None,**trigger_args)
7. 輸出作業(yè)信息:
使用 scheduler.print_jobs(jobstore=None,out=sys.stdout)
十、異常監(jiān)聽:
當(dāng)我們的任務(wù)拋出異常后,我們可以監(jiān)聽到,然后把錯(cuò)誤信息進(jìn)行記錄。示例代碼如下:
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.events import EVENT_JOB_EXECUTED, EVENT_JOB_ERROR
import datetime
import logging
# 配置日志顯示
以上便是 APScheduler庫的詳細(xì)用法了。如果我們需要在項(xiàng)目中開一個(gè)定時(shí)功能,完全可以選擇 APScheduler,輕量又功能強(qiáng)大。
這次女神再也不用2點(diǎn)跑到公司去加班啦~
總結(jié)
以上是生活随笔為你收集整理的asp python 定时任务_python定时任务最强框架APScheduler详细教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Introduction to the
- 下一篇: python图片找字_如何用python