最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Python 定時(shí)框架 Apscheduler原理及安裝過程

 更新時(shí)間:2019年06月14日 11:04:50   作者:鄭錚銓  
Apscheduler是一個(gè)非常強(qiáng)大且易用的類庫(kù),可以方便我們快速的搭建一些強(qiáng)大的定時(shí)任務(wù)或者定時(shí)監(jiān)控類的調(diào)度系統(tǒng),這篇文章主要介紹了Python 定時(shí)框架 Apscheduler ,需要的朋友可以參考下

在我們的日常工作自動(dòng)化測(cè)試當(dāng)中,幾乎超過一半的功能都需要利用定時(shí)的任務(wù)來推動(dòng)觸發(fā),例如在我們項(xiàng)目中有一個(gè)定時(shí)監(jiān)控模塊,根據(jù)自己設(shè)置的頻率定時(shí)跑測(cè)試用例,定時(shí)檢測(cè)是否存在線上緊急任務(wù)等等,這些都涉及到了有關(guān)定時(shí)任務(wù)的問題,很多情況下,大多數(shù)人會(huì)選擇window的任務(wù)計(jì)劃程序,但如果程序不在window平臺(tái)下運(yùn)行,就不能定時(shí)啟動(dòng)了;當(dāng)然也可利用time模塊的time.sleep()方法使程序休眠來達(dá)到定時(shí)任務(wù)的目的,但定時(shí)任務(wù)多了,代碼可能看起來不太那么友好且有很大的局限性,因此,此時(shí)的 Apscheduler 框架是你的不二選擇。

Apscheduler

Apscheduler基于Quartz的一個(gè)python定時(shí)任務(wù)框架,實(shí)現(xiàn)Quart的所有功能,相關(guān)的接口調(diào)用起來比較方便,目前其提供了基于日期、固定時(shí)間間隔以及corntab類型的任務(wù),并且同時(shí)可進(jìn)行持久化任務(wù);同時(shí)它提供了多種不同的調(diào)用器,方便開發(fā)者根據(jù)自己的需求進(jìn)行使用,也方便與數(shù)據(jù)庫(kù)等第三方的外部持久化儲(chǔ)存機(jī)制進(jìn)行協(xié)同工作,非常強(qiáng)大。

基本原理

總的來說,主要是利用python threading Event和Lock鎖來寫的。scheduler在主循環(huán)(main_loop)中, 反復(fù)檢查是否有需要執(zhí)行的任務(wù),完成任務(wù)的檢查函數(shù)為 _process_jobs,主要有那個(gè)幾個(gè)步驟:

1、 詢問儲(chǔ)存的每個(gè) jobStore ,是否有到期要執(zhí)行的任務(wù)。

2、 due_jobs 不為空,則計(jì)算這些jobs中每個(gè)job需要運(yùn)行的時(shí)間點(diǎn),時(shí)間一到就提交給submit作任務(wù)調(diào)度。

3、在主循環(huán)中,如果不間斷地調(diào)用,而實(shí)際上沒有要執(zhí)行的job,這會(huì)造成資源浪費(fèi)。因此在程序中,如果每次掉用 _process_jobs 后,進(jìn)行了預(yù)先判斷,判斷下一次要執(zhí)行的job(離現(xiàn)在最近的)還要多長(zhǎng)時(shí)間,作為返回值告訴main_loop, 這時(shí)主循環(huán)就可以去睡一覺,等大約這么長(zhǎng)時(shí)間后再喚醒,執(zhí)行下一次 _process_jobs 。

安裝

1、可以直接使用pip進(jìn)行安裝

2、源碼安裝

### 基礎(chǔ)概念

在Apscheduler中主要有以下幾個(gè)非常重要的概念,主要如下:

觸發(fā)器(trigger):

某一個(gè)工作到來時(shí)引發(fā)的事件,包含調(diào)度的邏輯,每一個(gè)作業(yè)都有它自己的觸發(fā)器,用于決定哪個(gè)作業(yè)任務(wù)會(huì)執(zhí)行,除了它們初始化配置之外,其完全是無狀態(tài)的。總的來說就是 一個(gè)任務(wù)應(yīng)該在什么時(shí)候執(zhí)行

執(zhí)行器(executor):

主要是處理作業(yè)的運(yùn)行,它將要執(zhí)行的作業(yè)放在新的線程或者線程池中運(yùn)行。執(zhí)行完畢之后,再通知調(diào)度器?;诰€程池的操作,可以針對(duì)不同類型的作業(yè)任務(wù),更為高效的使用CPU的計(jì)算資源。

作業(yè)存儲(chǔ)(job stores)

保存要調(diào)度的任務(wù),其中除了默認(rèn)的作業(yè)存儲(chǔ)是把作業(yè)保存在內(nèi)存中,其他的作業(yè)存儲(chǔ)是將作業(yè)保存在數(shù)據(jù)庫(kù)中。一個(gè)作業(yè)的數(shù)據(jù)將在保存在持久化的作業(yè)存儲(chǔ)之前,會(huì)對(duì)作業(yè)執(zhí)行序列化操作,當(dāng)重新讀取作業(yè)時(shí),再執(zhí)行反序列化操作。同時(shí),調(diào)度器不能分享同一個(gè)作業(yè)存儲(chǔ)。作業(yè)存儲(chǔ)支持主流的存儲(chǔ)機(jī)制:如redis,mongodb,關(guān)系型數(shù)據(jù)庫(kù),內(nèi)存等等。

調(diào)度器(scheduler):

負(fù)責(zé)將上面幾個(gè)組件聯(lián)系在一起,一般在應(yīng)用中只有一個(gè)調(diào)度器,程序開發(fā)者不會(huì)直接操作觸發(fā)器、作業(yè)存儲(chǔ)或執(zhí)行器,而是利用調(diào)度器提供了處理這些合適的接口,作業(yè)存儲(chǔ)和執(zhí)行器的配置都是通過在調(diào)度器中完成的。

在我們的使用過程中,選擇合適的 調(diào)度器 是根據(jù)我們的開發(fā)環(huán)境以及實(shí)際應(yīng)用來決定的,根據(jù)IO模型的不同,主要有下面一些常見的調(diào)度器:

  • BlockingScheduler:適合于只在進(jìn)程中運(yùn)行單個(gè)任務(wù)的情況
  • BackgroundScheduler: 適合于不運(yùn)行使用其他框架時(shí),并希望在程序后臺(tái)執(zhí)行的情況
  • AsyncIOScheduler:適合于使用asyncio框架的情況
  • GeventScheduler: 適合于使用gevent框架的情況
  • TornadoScheduler: 適合于使用Tornado框架的應(yīng)用
  • TwistedScheduler: 適合使用Twisted框架的應(yīng)用
  • QtScheduler: 適合使用QT的情況

而對(duì)于 作業(yè)存儲(chǔ) ,如果是非持久性作業(yè),使用默認(rèn)的 MemoryStore 就行了,若是持久性任務(wù),那么就需要根據(jù)應(yīng)用環(huán)境來進(jìn)行選擇。

大多數(shù)情況下, 執(zhí)行器 選擇 ThreadPoolExecutor 就夠用了,但如果涉及到比較消耗CPU的作業(yè),就可以選擇ProcessPoolExecutor* ,以充分利用多核CPU。當(dāng)然也可以同時(shí)配置使用兩個(gè)執(zhí)行器,將進(jìn)程池 ProcessPoolExecutor 調(diào)度器作為你的第二個(gè)執(zhí)行器。

配置調(diào)度器

Apscheduler框架提供了許多調(diào)度器的配置方法,既可以使用配置字典,也可以直接傳遞配置參數(shù)給調(diào)度器使用; 同時(shí)支持先初始化調(diào)度器,添加完作業(yè)任務(wù)后,再來配置調(diào)度器等。

說了這么多,我們可以來先舉個(gè)簡(jiǎn)單的例子:

上面的代碼生成一個(gè)默認(rèn)的調(diào)度器,默認(rèn)使用名為 default 的 MemoryJobStore,以及使用默認(rèn)名為 default 的 ThreadPoolExecutor ,最大線程數(shù)為10 。

下面進(jìn)行一個(gè)復(fù)雜的配置,同時(shí)使用兩個(gè)作業(yè)存儲(chǔ)和兩個(gè)執(zhí)行器,在這個(gè)配置中,修改默認(rèn)的配置參數(shù),jobstored指的是job持久化,默認(rèn)job運(yùn)行在內(nèi)存中,可持久化在數(shù)據(jù)庫(kù),指定為mongo的MongoDBJobStore或者是使用sqlite的SQLAlchemyJobStore,同時(shí)可指定多種jobstore。

coalesce :當(dāng)由于某種原因?qū)е履硞€(gè)job積攢了好幾次沒有實(shí)際運(yùn)行(比如說系統(tǒng)掛了5分鐘后恢復(fù),有一個(gè)任務(wù)是每分鐘跑一次的,按道理說這5分鐘內(nèi)本來是“計(jì)劃”運(yùn)行5次的,但實(shí)際沒有執(zhí)行),如果coalesce為True,下次這個(gè)job被submit給executor時(shí),只會(huì)執(zhí)行1次,也就是最后這次,如果為False,那么會(huì)執(zhí)行5次(不一定,因?yàn)檫€有其他條件,看后面misfiregracetime的解釋)。

max_instance :每個(gè)job在同一時(shí)刻能夠運(yùn)行的最大實(shí)例數(shù),默認(rèn)情況下為1個(gè),可以指定為更大值,這樣即使上個(gè)job還沒運(yùn)行完同一個(gè)job又被調(diào)度的話也能夠再開一個(gè)線程執(zhí)行。

misfire_grace_time :?jiǎn)挝粸槊?假設(shè)有這么一種情況,當(dāng)某一job被調(diào)度時(shí)剛好線程池都被占滿,調(diào)度器會(huì)選擇將該job排隊(duì)不運(yùn)行,misfiregracetime參數(shù)則是在線程池有可用線程時(shí)會(huì)比對(duì)該job的應(yīng)調(diào)度時(shí)間跟當(dāng)前時(shí)間的差值,如果差值<misfiregracetime時(shí),調(diào)度器會(huì)再次調(diào)度該job.反之該job的執(zhí)行狀態(tài)為EVENTJOBMISSED了,即錯(cuò)過運(yùn)行.</misfire。

啟動(dòng)/關(guān)閉調(diào)度器

使用 start() 方法來啟動(dòng)調(diào)度器,其中須注意的是 BlockingScheduler 需要在初始化之后才能執(zhí)行 start() ,對(duì)于其他的調(diào)度器,調(diào)用 start() 方法都會(huì)直接返回,然后可以繼續(xù)執(zhí)行后面的初始化操作。同時(shí),調(diào)度器啟動(dòng)之后,就不能再更改它的配置了。

在默認(rèn)情況下,調(diào)度器會(huì)等所有的作業(yè)任務(wù)完成后,自動(dòng)關(guān)閉所有的調(diào)度器及作業(yè)存儲(chǔ)。若在使用過程中不想等待,可以將 wait 參數(shù)選項(xiàng)設(shè)為 False ,則表示直接關(guān)閉:

調(diào)度器監(jiān)聽事件

可以給調(diào)度器添加事件監(jiān)聽器,調(diào)度器事件只有在某些情況下才會(huì)被觸發(fā),并且可以攜帶某些有用的信息。通過給 add_listener() 傳遞合適的 mask 參數(shù),可以只監(jiān)聽?zhēng)追N特定的事件類型,具體類型可看源碼中的 event.exception 或者 event.code 值來做識(shí)別判斷。

 

作業(yè)及作業(yè)存儲(chǔ)

jobstore提供給scheduler一個(gè)序列化jobs的統(tǒng)一抽象,提供對(duì)scheduler中job的增刪改查接口,根據(jù)存儲(chǔ)backend的不同,分以下幾種:

MemoryJobStore :沒有序列化,jobs就存在內(nèi)存里,增刪改查也都是在內(nèi)存中操作

SQLAlchemyJobStore :所有sqlalchemy支持的數(shù)據(jù)庫(kù)都可以做為backend,增刪改查操作轉(zhuǎn)化為對(duì)應(yīng)backend的sql語(yǔ)句

MongoDBJobStore :用mongodb作backend

RedisJobStore : 用redis作backend

Job是框架承接目前需要執(zhí)行的工作和任務(wù),我們可以在系統(tǒng)運(yùn)行過程中進(jìn)行動(dòng)態(tài)的增加、修改、刪除、查詢等操作。

1、添加作業(yè)

上面是通過 add_job() 來添加作業(yè),另外還有一種方式是通過修飾器 scheduled_job 來動(dòng)態(tài)裝飾 Job 的實(shí)際函數(shù)

 

2、移除作業(yè)

 

3、暫停作業(yè)

4、恢復(fù)作業(yè)

5、修改作業(yè)

6、獲取Job列表

獲得調(diào)度作業(yè)的列表,可以使用 get_jobs() 來完成,它會(huì)返回所有的job實(shí)例,同時(shí)也可使用 print_jobs() 來輸出所有格式化的作業(yè)列表。也可以利用 get_job(任務(wù)ID) 獲取指定任務(wù)的作業(yè)列表

作業(yè)運(yùn)行控制

add_job() 方法的第二個(gè)參數(shù)是trigger,它管理著作業(yè)任務(wù)的調(diào)度方式,它可以被設(shè)置為 data 、 interval 、 corn 三種類別。對(duì)于不同的設(shè)置類別,對(duì)應(yīng)的參數(shù)也有所不同,具體如下:

1、corn 定時(shí)調(diào)度,即規(guī)定在某一時(shí)刻執(zhí)行

使用例子:

2、interval間隔調(diào)度,即每隔多久執(zhí)行一次

3、data定時(shí)調(diào)度,即設(shè)置后作業(yè)只會(huì)執(zhí)行一次,是最基本的調(diào)度模式

總結(jié)

Apscheduler是一個(gè)非常強(qiáng)大且易用的類庫(kù),可以方便我們快速的搭建一些強(qiáng)大的定時(shí)任務(wù)或者定時(shí)監(jiān)控類的調(diào)度系統(tǒng),在實(shí)際工作中非常有用,同時(shí)其也提供了不少的擴(kuò)展點(diǎn)。

以上所述是小編給大家介紹的Python 定時(shí)框架 Apscheduler,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

相關(guān)文章

  • 解決Django連接db遇到的問題

    解決Django連接db遇到的問題

    今天小編大家分享一篇解決Django連接db遇到的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • 使用Python編寫一個(gè)Lisp語(yǔ)言的解釋器

    使用Python編寫一個(gè)Lisp語(yǔ)言的解釋器

    這篇文章主要為大家詳細(xì)介紹了如何使用Python編寫一個(gè)簡(jiǎn)單的Lisp語(yǔ)言的解釋器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • 一文詳解如何使用Python從字符串中提取數(shù)字

    一文詳解如何使用Python從字符串中提取數(shù)字

    這篇文章主要給大家介紹了關(guān)于如何使用Python從字符串中提取數(shù)字的相關(guān)資料,我們?cè)谶M(jìn)行數(shù)據(jù)處理時(shí)候,可能想要提取字符串中的數(shù)字進(jìn)行分析,需要的朋友可以參考下
    2023-11-11
  • python生成多個(gè)只含0,1元素的隨機(jī)數(shù)組或列表的實(shí)例

    python生成多個(gè)只含0,1元素的隨機(jī)數(shù)組或列表的實(shí)例

    今天小編就為大家分享一篇python生成多個(gè)只含0,1元素的隨機(jī)數(shù)組或列表的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • python使用pytest接口自動(dòng)化測(cè)試的使用

    python使用pytest接口自動(dòng)化測(cè)試的使用

    這篇文章主要介紹了python使用pytest接口自動(dòng)化測(cè)試的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 簡(jiǎn)單了解python協(xié)程的相關(guān)知識(shí)

    簡(jiǎn)單了解python協(xié)程的相關(guān)知識(shí)

    這篇文章主要介紹了簡(jiǎn)單了解python協(xié)程的相關(guān)知識(shí),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • python3.7將代碼打包成exe程序并添加圖標(biāo)的方法

    python3.7將代碼打包成exe程序并添加圖標(biāo)的方法

    這篇文章主要介紹了python3.7將代碼打包成exe程序并添加圖標(biāo)的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-10-10
  • Python實(shí)現(xiàn)多線程HTTP下載器示例

    Python實(shí)現(xiàn)多線程HTTP下載器示例

    本篇文章主要介紹了Python實(shí)現(xiàn)多線程HTTP下載器示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • Python實(shí)現(xiàn)發(fā)送聲情并茂的郵件內(nèi)容和附件

    Python實(shí)現(xiàn)發(fā)送聲情并茂的郵件內(nèi)容和附件

    Python是一種高級(jí)編程語(yǔ)言,它可以用于編寫各種類型的應(yīng)用程序,包括發(fā)送電子郵件。本文就來演示如何使用Python發(fā)送HTML格式的電子郵件,感興趣的可以了解一下
    2023-04-04
  • Python反轉(zhuǎn)序列的方法實(shí)例分析

    Python反轉(zhuǎn)序列的方法實(shí)例分析

    這篇文章主要介紹了Python反轉(zhuǎn)序列的方法,結(jié)合實(shí)例形式分析了列表、元組及字符串反轉(zhuǎn)的具體實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-03-03

最新評(píng)論

大石桥市| 满洲里市| 清涧县| 台南县| 青川县| 新闻| 宣恩县| 富宁县| 明水县| 金溪县| 新乡县| 江孜县| 大渡口区| 永济市| 库伦旗| 烟台市| 哈巴河县| 庆安县| 富蕴县| 湛江市| 卓资县| 全南县| 鹤壁市| 互助| 高密市| 古蔺县| 如东县| 调兵山市| 扎鲁特旗| 南雄市| 南投市| 巨鹿县| 鸡东县| 竹山县| 南雄市| 衡东县| 广河县| 岱山县| 新干县| 原平市| 响水县|