您好,登錄后才能下訂單哦!
在我們的日常工作自動化測試當中,幾乎超過一半的功能都需要利用定時的任務來推動觸發,例如在我們項目中有一個定時監控模塊,根據自己設置的頻率定時跑測試用例,定時檢測是否存在線上緊急任務等等,這些都涉及到了有關定時任務的問題,很多情況下,大多數人會選擇window的任務計劃程序,但如果程序不在window平臺下運行,就不能定時啟動了;當然也可利用time模塊的time.sleep()方法使程序休眠來達到定時任務的目的,但定時任務多了,代碼可能看起來不太那么友好且有很大的局限性,因此,此時的 Apscheduler 框架是你的不二選擇。
Apscheduler
Apscheduler基于Quartz的一個python定時任務框架,實現Quart的所有功能,相關的接口調用起來比較方便,目前其提供了基于日期、固定時間間隔以及corntab類型的任務,并且同時可進行持久化任務;同時它提供了多種不同的調用器,方便開發者根據自己的需求進行使用,也方便與數據庫等第三方的外部持久化儲存機制進行協同工作,非常強大。
基本原理
總的來說,主要是利用python threading Event和Lock鎖來寫的。scheduler在主循環(main_loop)中, 反復檢查是否有需要執行的任務,完成任務的檢查函數為 _process_jobs,主要有那個幾個步驟:
1、 詢問儲存的每個 jobStore
,是否有到期要執行的任務。
2、 due_jobs
不為空,則計算這些jobs中每個job需要運行的時間點,時間一到就提交給submit作任務調度。
3、在主循環中,如果不間斷地調用,而實際上沒有要執行的job,這會造成資源浪費。因此在程序中,如果每次掉用 _process_jobs
后,進行了預先判斷,判斷下一次要執行的job(離現在最近的)還要多長時間,作為返回值告訴main_loop, 這時主循環就可以去睡一覺,等大約這么長時間后再喚醒,執行下一次 _process_jobs
。
安裝
1、可以直接使用pip進行安裝
2、源碼安裝
### 基礎概念
在Apscheduler中主要有以下幾個非常重要的概念,主要如下:
觸發器(trigger):
某一個工作到來時引發的事件,包含調度的邏輯,每一個作業都有它自己的觸發器,用于決定哪個作業任務會執行,除了它們初始化配置之外,其完全是無狀態的。總的來說就是 一個任務應該在什么時候執行
執行器(executor):
主要是處理作業的運行,它將要執行的作業放在新的線程或者線程池中運行。執行完畢之后,再通知調度器。基于線程池的操作,可以針對不同類型的作業任務,更為高效的使用CPU的計算資源。
作業存儲(job stores)
保存要調度的任務,其中除了默認的作業存儲是把作業保存在內存中,其他的作業存儲是將作業保存在數據庫中。一個作業的數據將在保存在持久化的作業存儲之前,會對作業執行序列化操作,當重新讀取作業時,再執行反序列化操作。同時,調度器不能分享同一個作業存儲。作業存儲支持主流的存儲機制:如redis,mongodb,關系型數據庫,內存等等。
調度器(scheduler):
負責將上面幾個組件聯系在一起,一般在應用中只有一個調度器,程序開發者不會直接操作觸發器、作業存儲或執行器,而是利用調度器提供了處理這些合適的接口,作業存儲和執行器的配置都是通過在調度器中完成的。
在我們的使用過程中,選擇合適的 調度器 是根據我們的開發環境以及實際應用來決定的,根據IO模型的不同,主要有下面一些常見的調度器:
而對于 作業存儲 ,如果是非持久性作業,使用默認的 MemoryStore 就行了,若是持久性任務,那么就需要根據應用環境來進行選擇。
大多數情況下, 執行器 選擇 ThreadPoolExecutor 就夠用了,但如果涉及到比較消耗CPU的作業,就可以選擇ProcessPoolExecutor* ,以充分利用多核CPU。當然也可以同時配置使用兩個執行器,將進程池 ProcessPoolExecutor 調度器作為你的第二個執行器。
配置調度器
Apscheduler框架提供了許多調度器的配置方法,既可以使用配置字典,也可以直接傳遞配置參數給調度器使用; 同時支持先初始化調度器,添加完作業任務后,再來配置調度器等。
說了這么多,我們可以來先舉個簡單的例子:
上面的代碼生成一個默認的調度器,默認使用名為 default 的 MemoryJobStore,以及使用默認名為 default 的 ThreadPoolExecutor ,最大線程數為10 。
下面進行一個復雜的配置,同時使用兩個作業存儲和兩個執行器,在這個配置中,修改默認的配置參數,jobstored指的是job持久化,默認job運行在內存中,可持久化在數據庫,指定為mongo的MongoDBJobStore或者是使用sqlite的SQLAlchemyJobStore,同時可指定多種jobstore。
coalesce
:當由于某種原因導致某個job積攢了好幾次沒有實際運行(比如說系統掛了5分鐘后恢復,有一個任務是每分鐘跑一次的,按道理說這5分鐘內本來是“計劃”運行5次的,但實際沒有執行),如果coalesce為True,下次這個job被submit給executor時,只會執行1次,也就是最后這次,如果為False,那么會執行5次(不一定,因為還有其他條件,看后面misfiregracetime的解釋)。
max_instance
:每個job在同一時刻能夠運行的最大實例數,默認情況下為1個,可以指定為更大值,這樣即使上個job還沒運行完同一個job又被調度的話也能夠再開一個線程執行。
misfire_grace_time
:單位為秒,假設有這么一種情況,當某一job被調度時剛好線程池都被占滿,調度器會選擇將該job排隊不運行,misfiregracetime參數則是在線程池有可用線程時會比對該job的應調度時間跟當前時間的差值,如果差值<misfiregracetime時,調度器會再次調度該job.反之該job的執行狀態為EVENTJOBMISSED了,即錯過運行.</misfire。
啟動/關閉調度器
使用 start() 方法來啟動調度器,其中須注意的是 BlockingScheduler
需要在初始化之后才能執行 start()
,對于其他的調度器,調用 start()
方法都會直接返回,然后可以繼續執行后面的初始化操作。同時,調度器啟動之后,就不能再更改它的配置了。
在默認情況下,調度器會等所有的作業任務完成后,自動關閉所有的調度器及作業存儲。若在使用過程中不想等待,可以將 wait
參數選項設為 False
,則表示直接關閉:
調度器監聽事件
可以給調度器添加事件監聽器,調度器事件只有在某些情況下才會被觸發,并且可以攜帶某些有用的信息。通過給 add_listener()
傳遞合適的 mask
參數,可以只監聽幾種特定的事件類型,具體類型可看源碼中的 event.exception
或者 event.code
值來做識別判斷。
作業及作業存儲
jobstore提供給scheduler一個序列化jobs的統一抽象,提供對scheduler中job的增刪改查接口,根據存儲backend的不同,分以下幾種:
MemoryJobStore
:沒有序列化,jobs就存在內存里,增刪改查也都是在內存中操作
SQLAlchemyJobStore
:所有sqlalchemy支持的數據庫都可以做為backend,增刪改查操作轉化為對應backend的sql語句
MongoDBJobStore
:用mongodb作backend
RedisJobStore
: 用redis作backend
Job是框架承接目前需要執行的工作和任務,我們可以在系統運行過程中進行動態的增加、修改、刪除、查詢等操作。
1、添加作業
上面是通過 add_job()
來添加作業,另外還有一種方式是通過修飾器 scheduled_job
來動態裝飾 Job 的實際函數
2、移除作業
3、暫停作業
4、恢復作業
5、修改作業
6、獲取Job列表
獲得調度作業的列表,可以使用 get_jobs()
來完成,它會返回所有的job實例,同時也可使用 print_jobs()
來輸出所有格式化的作業列表。也可以利用 get_job(任務ID)
獲取指定任務的作業列表
作業運行控制
add_job()
方法的第二個參數是trigger,它管理著作業任務的調度方式,它可以被設置為 data
、 interval
、 corn
三種類別。對于不同的設置類別,對應的參數也有所不同,具體如下:
1、corn 定時調度,即規定在某一時刻執行
使用例子:
2、interval間隔調度,即每隔多久執行一次
3、data定時調度,即設置后作業只會執行一次,是最基本的調度模式
總結
Apscheduler是一個非常強大且易用的類庫,可以方便我們快速的搭建一些強大的定時任務或者定時監控類的調度系統,在實際工作中非常有用,同時其也提供了不少的擴展點。
以上所述是小編給大家介紹的Python 定時框架 Apscheduler,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。