欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python輕量級(jí)定時(shí)任務(wù)調(diào)度APScheduler的使用

 更新時(shí)間:2024年02月05日 16:01:03   作者:真·skysys  
Apscheduler是一個(gè)基于Quartz的python定時(shí)任務(wù)框架,本文主要介紹了Python輕量級(jí)定時(shí)任務(wù)調(diào)度APScheduler的使用,具有一定的參考價(jià)值,感興趣的可以了解一下

簡(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)文章

最新評(píng)論