亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python定時庫APScheduler的原理以及用法示例

 更新時間:2021年12月21日 11:03:57   作者:戰(zhàn)渣渣  
APScheduler的全稱是Advanced Python Scheduler,它是一個輕量級的 Python 定時任務(wù)調(diào)度框架,下面這篇文章主要給大家介紹了關(guān)于Python定時庫APScheduler的原理以及用法的相關(guān)資料,需要的朋友可以參考下

1. APScheduler簡介

APscheduler全稱Advanced Python Scheduler

作用為在指定的時間規(guī)則執(zhí)行指定的作業(yè)。

  • 指定時間規(guī)則的方式可以是間隔多久執(zhí)行,可以是指定日期時間的執(zhí)行,也可以類似Linux系統(tǒng)中Crontab中的方式執(zhí)行任務(wù)。
  • 指定的任務(wù)就是一個Python函數(shù)。

2. APScheduler組件

APScheduler版本 3.6.3

2.1. APScheduler中幾個重要的概念

2.1.1. Job 作業(yè)

作用

Job作為APScheduler最小執(zhí)行單位。

創(chuàng)建Job時指定執(zhí)行的函數(shù),函數(shù)中所需參數(shù),Job執(zhí)行時的一些設(shè)置信息。

構(gòu)建說明

id:指定作業(yè)的唯一ID

name:指定作業(yè)的名字

trigger:apscheduler定義的觸發(fā)器,用于確定Job的執(zhí)行時間,根據(jù)設(shè)置的trigger規(guī)則,計算得到下次執(zhí)行此job的時間, 滿足時將會執(zhí)行

executor:apscheduler定義的執(zhí)行器,job創(chuàng)建時設(shè)置執(zhí)行器的名字,根據(jù)字符串你名字到scheduler獲取到執(zhí)行此job的 執(zhí)行器,執(zhí)行job指定的函數(shù)

max_instances:執(zhí)行此job的最大實例數(shù),executor執(zhí)行job時,根據(jù)job的id來計算執(zhí)行次數(shù),根據(jù)設(shè)置的最大實例數(shù)來確定是否可執(zhí)行

next_run_time:Job下次的執(zhí)行時間,創(chuàng)建Job時可以指定一個時間[datetime],不指定的話則默認根據(jù)trigger獲取觸發(fā)時間

misfire_grace_time:Job的延遲執(zhí)行時間,例如Job的計劃執(zhí)行時間是21:00:00,但因服務(wù)重啟或其他原因?qū)е?1:00:31才執(zhí)行,如果設(shè)置此key為40,則該job會繼續(xù)執(zhí)行,否則將會丟棄此job

coalesce:Job是否合并執(zhí)行,是一個bool值。例如scheduler停止20s后重啟啟動,而job的觸發(fā)器設(shè)置為5s執(zhí)行一次,因此此job錯過了4個執(zhí)行時間,如果設(shè)置為是,則會合并到一次執(zhí)行,否則會逐個執(zhí)行

func:Job執(zhí)行的函數(shù)

args:Job執(zhí)行函數(shù)需要的位置參數(shù)

kwargs:Job執(zhí)行函數(shù)需要的關(guān)鍵字參數(shù)

2.1.2. Trigger 觸發(fā)器

Trigger綁定到Job,在scheduler調(diào)度篩選Job時,根據(jù)觸發(fā)器的規(guī)則計算出Job的觸發(fā)時間,然后與當前時間比較

確定此Job是否會被執(zhí)行,總之就是根據(jù)trigger規(guī)則計算出下一個執(zhí)行時間。

Trigger有多種種類,指定時間的DateTrigger,指定間隔時間的IntervalTrigger,像Linux的crontab一樣的CronTrigger

目前APScheduler支持觸發(fā)器:

DateTrigger

IntervalTrigger

CronTrigger

2.1.3. Executor 執(zhí)行器

Executor在scheduler中初始化,另外也可通過scheduler的add_executor動態(tài)添加Executor。?

每個executor都會綁定一個alias,這個作為唯一標識綁定到Job,在實際執(zhí)行時會根據(jù)Job綁定的executor找到實際的執(zhí)行器對象,然后根據(jù)執(zhí)行器對象執(zhí)行Job

Executor的種類會根據(jù)不同的調(diào)度來選擇,如果選擇AsyncIO作為調(diào)度的庫,那么選擇AsyncIOExecutor,如果選擇tornado作為調(diào)度的庫,選擇TornadoExecutor,如果選擇啟動進程作為調(diào)度,選擇ThreadPoolExecutor或者ProcessPoolExecutor都可以

Executor的選擇需要根據(jù)實際的scheduler來選擇不同的執(zhí)行器

目前APScheduler支持的Executor:

AsyncIOExecutor

GeventExecutor

ThreadPoolExecutor

ProcessPoolExecutor

TornadoExecutor

TwistedExecutor

2.1.4. Jobstore 作業(yè)存儲

Jobstore在scheduler中初始化,另外也可通過scheduler的add_jobstore動態(tài)添加Jobstore。每個jobstore都會綁定一個alias,scheduler在Add Job時,根據(jù)指定的jobstore在scheduler中找到相應(yīng)的jobstore,并將job添加到j(luò)obstore中。

Jobstore主要是通過pickle庫的loads和dumps【實現(xiàn)核心是通過python的__getstate__和__setstate__重寫實現(xiàn)】,每次變更時將Job動態(tài)保存到存儲中,使用時再動態(tài)的加載出來,作為存儲的可以是redis,也可以是數(shù)據(jù)庫【通過sqlarchemy這個庫集成多種數(shù)據(jù)庫】,也可以是mongodb等

目前APScheduler支持的Jobstore:

MemoryJobStore

MongoDBJobStore

RedisJobStore

RethinkDBJobStore

SQLAlchemyJobStore

ZooKeeperJobStore

2.1.5. Event 事件

Event是APScheduler在進行某些操作時觸發(fā)相應(yīng)的事件,用戶可以自定義一些函數(shù)來監(jiān)聽這些事件,當觸發(fā)某些Event時,做一些具體的操作

常見的比如。Job執(zhí)行異常事件 EVENT_JOB_ERROR。Job執(zhí)行時間錯過事件 EVENT_JOB_MISSED。

目前APScheduler定義的Event

EVENT_SCHEDULER_STARTED

EVENT_SCHEDULER_START

EVENT_SCHEDULER_SHUTDOWN

EVENT_SCHEDULER_PAUSED

EVENT_SCHEDULER_RESUMED

EVENT_EXECUTOR_ADDED

EVENT_EXECUTOR_REMOVED

EVENT_JOBSTORE_ADDED

EVENT_JOBSTORE_REMOVED

EVENT_ALL_JOBS_REMOVED

EVENT_JOB_ADDED

EVENT_JOB_REMOVED

EVENT_JOB_MODIFIED

EVENT_JOB_EXECUTED

EVENT_JOB_ERROR

EVENT_JOB_MISSED

EVENT_JOB_SUBMITTED

EVENT_JOB_MAX_INSTANCES

2.1.6. Listener 監(jiān)聽事件

Listener表示用戶自定義監(jiān)聽的一些Event,當Job觸發(fā)了EVENT_JOB_MISSED事件時

可以根據(jù)需求做一些其他處理。

2.1.7. Scheduler 調(diào)度器

Scheduler是APScheduler的核心,所有相關(guān)組件通過其定義。scheduler啟動之后,將開始按照配置的任務(wù)進行調(diào)度。

除了依據(jù)所有定義Job的trigger生成的將要調(diào)度時間喚醒調(diào)度之外。當發(fā)生Job信息變更時也會觸發(fā)調(diào)度。

scheduler可根據(jù)自身的需求選擇不同的組件,如果是使用AsyncIO則選擇AsyncIOScheduler,使用tornado則

選擇TornadoScheduler。

目前APScheduler支持的Scheduler:

AsyncIOScheduler

BackgroundScheduler

BlockingScheduler

GeventScheduler

QtScheduler

TornadoScheduler

TwistedScheduler

2.2. Scheduler工作流程圖

這里重點挑選兩個重要的流程畫一個簡陋的流程圖,來看一下scheduler的工作原理。其一個是添加add job,另一是scheduler每次喚醒調(diào)度時的執(zhí)行過程

2.2.1. Scheduler添加job流程

2.2.2 Scheduler調(diào)度流程

3. APScheduler使用示例

AsyncIO調(diào)度示例

import asyncio

import datetime

from apscheduler.events import EVENT_JOB_EXECUTED

from apscheduler.executors.asyncio import AsyncIOExecutor

from apscheduler.jobstores.redis import RedisJobStore  # 需要安裝redis

from apscheduler.schedulers.asyncio import AsyncIOScheduler

from apscheduler.triggers.interval import IntervalTrigger

from apscheduler.triggers.cron import CronTrigger

# 定義jobstore  使用redis 存儲job信息

default_redis_jobstore = RedisJobStore(

    db=2,

    jobs_key="apschedulers.default_jobs",

    run_times_key="apschedulers.default_run_times",

    host="127.0.0.1",

    port=6379,

    password="test"

)

# 定義executor 使用asyncio是的調(diào)度執(zhí)行規(guī)則

first_executor = AsyncIOExecutor()

# 初始化scheduler時,可以直接指定jobstore和executor

init_scheduler_options = {

    "jobstores": {

        # first 為 jobstore的名字,在創(chuàng)建Job時直接直接此名字即可

        "default": default_redis_jobstore

    },

    "executors": {

        # first 為 executor 的名字,在創(chuàng)建Job時直接直接此名字,執(zhí)行時則會使用此executor執(zhí)行

        "first": first_executor

    },

    # 創(chuàng)建job時的默認參數(shù)

    "job_defaults": {

        'coalesce': False,  # 是否合并執(zhí)行

        'max_instances': 1  # 最大實例數(shù)

    }

}

# 創(chuàng)建scheduler

scheduler = AsyncIOScheduler(**init_scheduler_options)

# 啟動調(diào)度

scheduler.start()

second_redis_jobstore = RedisJobStore(

    db=2,

    jobs_key="apschedulers.second_jobs",

    run_times_key="apschedulers.second_run_times",

    host="127.0.0.1",

    port=6379,

    password="test"

)

scheduler.add_jobstore(second_redis_jobstore, 'second')

# 定義executor 使用asyncio是的調(diào)度執(zhí)行規(guī)則

second_executor = AsyncIOExecutor()

scheduler.add_executor(second_executor, "second")

# ***********               關(guān)于 APScheduler中有關(guān)Event相關(guān)使用示例               *************

# 定義函數(shù)監(jiān)聽事件

def job_execute(event):

    """

    監(jiān)聽事件處理

    :param event:

    :return:

    """

    print(

        "job執(zhí)行job:\ncode => {}\njob.id => {}\njobstore=>{}".format(

            event.code,

            event.job_id,

            event.jobstore

        ))

# 給EVENT_JOB_EXECUTED[執(zhí)行完成job事件]添加回調(diào),這里就是每次Job執(zhí)行完成了我們就輸出一些信息

scheduler.add_listener(job_execute, EVENT_JOB_EXECUTED)

# ***********               關(guān)于 APScheduler中有關(guān)Job使用示例               *************

# 使用的是asyncio,所以job執(zhí)行的函數(shù)可以是一個協(xié)程,也可以是一個普通函數(shù),AsyncIOExecutor會根據(jù)配置的函數(shù)來進行調(diào)度,

# 如果是協(xié)程則會直接丟入到loop中,如果是普通函數(shù)則會啟用線程處理

# 我們定義兩個函數(shù)來看看執(zhí)行的結(jié)果

def interval_func(message):

    print("現(xiàn)在時間: {}".format(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")))

    print("我是普通函數(shù)")

    print(message)

async def async_func(message):

    print("現(xiàn)在時間: {}".format(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")))

    print("我是協(xié)程")

    print(message)

# 將上述的兩個函數(shù)按照不同的方式創(chuàng)造觸發(fā)器來執(zhí)行

# ***********               關(guān)于 APScheduler中有關(guān)Trigger使用示例               *************

# 使用Trigger有兩種方式,一種是用類創(chuàng)建使用,另一個是使用字符串的方式

# 使用字符串指定別名, scheduler初始化時已將其定義的trigger加載,所以指定字符串可以直接使用

if scheduler.get_job("interval_func_test", "default"):

    # 存在的話,先刪除

    scheduler.remove_job("interval_func_test", "default")

# 立馬開始 2分鐘后結(jié)束, 每10s執(zhí)行一次 存儲到first jobstore  second執(zhí)行

scheduler.add_job(interval_func, "interval",

                  args=["我是10s執(zhí)行一次,存放在jobstore default, executor default"],

                  seconds=10,

                  id="interval_func_test",

                  jobstore="default",

                  executor="default",

                  start_date=datetime.datetime.now(),

                  end_date=datetime.datetime.now() + datetime.timedelta(seconds=240))

# 先創(chuàng)建tigger

trigger = IntervalTrigger(seconds=5)

if scheduler.get_job("interval_func_test_2", "second"):

    # 存在的話,先刪除

    scheduler.remove_job("interval_func_test_2", "second")

# 每隔5s執(zhí)行一次

scheduler.add_job(async_func, trigger, args=["我是每隔5s執(zhí)行一次,存放在jobstore second, executor = second"],

                  id="interval_func_test_2",

                  jobstore="second",

                  executor="second")

# 使用協(xié)程的函數(shù)執(zhí)行,且使用cron的方式配置觸發(fā)器

if scheduler.get_job("cron_func_test", "default"):

    # 存在的話,先刪除

    scheduler.remove_job("cron_func_test", "default")

# 立馬開始 每10s執(zhí)行一次

scheduler.add_job(async_func, "cron",

                  args=["我是 每分鐘 30s  時執(zhí)行一次,存放在jobstore default, executor default"],

                  second='30',

                  id="cron_func_test",

                  jobstore="default",

                  executor="default")

# 先創(chuàng)建tigger

trigger = CronTrigger(second='20,40')

if scheduler.get_job("cron_func_test_2", "second"):

    # 存在的話,先刪除

    scheduler.remove_job("cron_func_test_2", "second")

# 每隔5s執(zhí)行一次

scheduler.add_job(async_func, trigger, args=["我是每分鐘 20s  40s時各執(zhí)行一次,存放在jobstore second, executor = second"],

                  id="cron_func_test_2",

                  jobstore="second",

                  executor="second")

# 使用創(chuàng)建trigger對象直接創(chuàng)建

print("啟動: {}".format(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")))

asyncio.get_event_loop().run_forever()

輸出結(jié)果部分截取

啟動之后,每隔5s運行一次的JOB

啟動: 2019-12-05 14:13:11

【這部分是定義的協(xié)程函數(shù)輸出的內(nèi)容】

現(xiàn)在時間: 2019-12-05 14:13:16

我是協(xié)程

我是每隔5s執(zhí)行一次,存放在jobstore second, executor = second

【這部分是監(jiān)聽job執(zhí)行完成之后的回調(diào)輸出】

job執(zhí)行job: code => 4096

job.id => interval_func_test_2

jobstore=>second

在20s和40s時各執(zhí)行一次的Job

現(xiàn)在時間: 2019-12-05 14:13:20

我是協(xié)程

我是每分鐘 20s 40s時各執(zhí)行一次,存放在jobstore second, executor = second

job執(zhí)行

job: code => 4096

job.id => cron_func_test_2

jobstore=>second

每隔10s執(zhí)行一次的job

現(xiàn)在時間: 2019-12-05 14:13:21

我是普通函數(shù)

我是10s執(zhí)行一次,存放在jobstore default, executor default

現(xiàn)在時間: 2019-12-05 14:13:21

我是協(xié)程

我是每隔5s執(zhí)行一次,存放在jobstore second, executor = second

job執(zhí)行job: code => 4096

job.id => interval_func_test

jobstore=>default

job執(zhí)行

job: code => 4096

job.id => interval_func_test_2

jobstore=>second

每隔5s執(zhí)行一次的Job

現(xiàn)在時間: 2019-12-05 14:13:26

我是協(xié)程

我是每隔5s執(zhí)行一次,存放在jobstore second, executor = second

job執(zhí)行

job: code => 4096

job.id => interval_func_test_2

jobstore=>second

每分鐘30s時執(zhí)行一次

現(xiàn)在時間: 2019-12-05 14:13:30

我是協(xié)程

我是 每分鐘 30s 時執(zhí)行一次,存放在jobstore default, executor default

job執(zhí)行

job: code => 4096

job.id => cron_func_test

jobstore=>default

總結(jié)

apscheduler的工作原理及用法基本這樣。

apscheduler強大的地方是可以集成到tornado,django,flask等框架,也可以單獨運行。比如CronTrigger還有更強大的用法,可以參照官網(wǎng)的cron用法

上面例子只列舉了一些常規(guī)用法,其實還有一些更切合實際的用法,利用APSchedulder的特性,動態(tài)的添加Job,暫停Job,刪除Job,重啟Job等。先按照功能性質(zhì)定義好不同的函數(shù),然后開發(fā)一個web服務(wù)。在web服務(wù)中動態(tài)操作各種Job,可以想象在監(jiān)控系統(tǒng)中根據(jù)需求添加一些任務(wù),豈不美哉。

有時間將這部分做一個例子再來分享。

到此這篇關(guān)于Python定時庫APScheduler的原理以及用法的文章就介紹到這了,更多相關(guān)Python定時庫APScheduler用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python 的 sum() Pythonic 的求和方法詳細

    Python 的 sum() Pythonic 的求和方法詳細

    Python 的內(nèi)置函數(shù)sum()是一種對數(shù)值列表求和的有效且Pythonic 的方法。將多個數(shù)字相加是許多計算中常見的中間步驟,因此sum()對于 Python 程序員來說是一個非常方便的工具。下面文章就讓我們一起來看具體內(nèi)容吧
    2021-10-10
  • python的語句結(jié)構(gòu)你真的了解嗎

    python的語句結(jié)構(gòu)你真的了解嗎

    這篇文章主要為大家詳細介紹了python的語句結(jié)構(gòu),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • python的slice notation的特殊用法詳解

    python的slice notation的特殊用法詳解

    今天小編就為大家分享一篇python的slice notation的特殊用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • 詳解flask表單提交的兩種方式

    詳解flask表單提交的兩種方式

    這篇文章主要介紹了詳解flask表單提交的兩種方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • python字符串切片及常用方法示例詳解

    python字符串切片及常用方法示例詳解

    這篇文章主要介紹了python字符串切片及常用方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • Python使用smtplib模塊發(fā)送電子郵件的流程詳解

    Python使用smtplib模塊發(fā)送電子郵件的流程詳解

    Python中自帶的smtplib模塊可以進行基于SMTP協(xié)議的郵件操作,這里我們便總結(jié)了Python使用smtplib模塊發(fā)送電子郵件的流程詳解,并對一些常見的問題給出了解決方法:
    2016-06-06
  • pycharm遠程linux開發(fā)和調(diào)試代碼的方法

    pycharm遠程linux開發(fā)和調(diào)試代碼的方法

    這篇文章主要介紹了pycharm遠程linux開發(fā)和調(diào)試代碼的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Python中格式化字符串的四種實現(xiàn)

    Python中格式化字符串的四種實現(xiàn)

    這篇文章主要介紹了Python中格式化字符串的四種實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • python3讀取autocad圖形文件.py實例

    python3讀取autocad圖形文件.py實例

    這篇文章主要介紹了python3讀取autocad圖形文件.py實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • python中 logging的使用詳解

    python中 logging的使用詳解

    這篇文章主要介紹了python中 logging的使用,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-10-10

最新評論