apscheduler簡單使用

APScheduler(Advanced Python Scheduler)是一個輕量級的Python定時任務調度框架(Python庫)。

安裝:

pip install apscheduler

基本概念介紹

觸發器(triggers):

觸發器包含調度邏輯,描述一個任務何時被觸發,按日期(date)或按時間間隔(interval)或按 cronjob 表達式(cron)三種方式觸發。每個作業都有它自己的觸發器,除了初始配置之外,觸發器是完全無狀態的。

作業存儲器(job stores):

作業存儲器指定了作業被存放的位置,默認情況下作業保存在內存,也可將作業保存在各種數據庫中,當作業被存放在數據庫中時,它會被序列化,當被重新加載時會反序列化。作業存儲器充當保存、加載、更新和查找作業的中間商。在調度器之間不能共享作業存儲。
任務儲存器的選擇,要看任務是否需要持久化。如果你運行的任務是無狀態的,選擇默認任務儲存器MemoryJobStore就可以應付。但是,如果你需要在程序關閉或重啓時,保存任務的狀態,那麼就要選擇持久化的任務儲存器。如果,作者推薦使用SQLAlchemyJobStore並搭配PostgreSQL作爲後臺數據庫。這個方案可以提供強大的數據整合與保護功能。

執行器(executors):

執行器是將指定的作業(調用函數)提交到線程池或進程池中運行,當任務完成時,執行器通知調度器觸發相應的事件。
執行器的選擇,同樣要看你的實際需求。默認的ThreadPoolExecutor線程池執行器方案可以滿足大部分需求。如果,你的程序是計算密集型的,那麼最好用ProcessPoolExecutor進程池執行器方案來充分利用多核算力。也可以將ProcessPoolExecutor作爲第二執行器,混合使用兩種不同的執行器

調度器(schedulers):

任務調度器,屬於控制角色,通過它配置作業存儲器、執行器和觸發器,添加、修改和刪除任務。調度器協調觸發器、作業存儲器、執行器的運行,通常只有一個調度程序運行在應用程序中,開發人員通常不需要直接處理作業存儲器、執行器或觸發器,配置作業存儲器和執行器是通過調度器來完成的。
分爲:
BlockingScheduler 阻塞式調度器:適用於只跑調度器的程序。
BackgroundScheduler 後臺調度器:適用於非阻塞的情況,調度器會在後臺獨立運行。
AsyncIOScheduler AsyncIO調度器,適用於應用使用AsnycIO的情況。
GeventScheduler Gevent調度器,適用於應用通過Gevent的情況。
TornadoScheduler Tornado調度器,適用於構建Tornado應用。
TwistedScheduler Twisted調度器,適用於構建Twisted應用。
QtScheduler Qt調度器,適用於構建Qt應用。

# 導入相關包:
from apscheduler.schedulers.blocking import BlockingScheduler
import logging
from apscheduler.events import EVENT_JOB_EXECUTED, EVENT_JOB_ERROR
# 定義一個簡單的函數用來測試:
def func():
    print("test")

# 配置日誌記錄信息,方便查找問題。
logging.basicConfig(level=logging.INFO,
                    
format = '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
         
datefmt = '%Y-%m-%d %H:%M:%S',
          
filename = 'log1.txt',
           
filemode = 'a')
#  定義一個事件監聽,出現意外情況打印相關信息報警。
def my_listener(event): 
    if event.exception:
        print ('任務出錯了!!!!!!')       
    else: 
        print ('任務照常運行...')
        
scheduler = BlockingScheduler()
scheduler.add_job(func,trigger='interval', seconds=3)
scheduler.add_listener(my_listener, EVENT_JOB_EXECUTED | EVENT_JOB_ERROR)
scheduler._logger = logging
scheduler.start()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章