python apscheduler定時任務處理

二月雪發表於2024-08-21
Apscheduler

Apscheduler是一個基於Quartz的python定時任務框架,提供了基於日期、固定時間間隔以及corntab型別的任務,並且可持久化任務。

安裝apscheduler依賴庫

pip install apscheduler
APScheduler元件:
  • schedulers -排程器
  • triggers -觸發器
  • job stores -作業儲存器
  • executors -執行器
schedulers(排程器)
  • BlockingScheduler 阻塞式排程器:適用於只跑排程器的程式。(常用)
  • BackgroundScheduler 後臺排程器:適用於非阻塞的情況,排程器會在後臺獨立執行。(常用)
  • AsyncIOScheduler AsyncIO排程器,適用於應用使用AsnycIO的情況。
  • GeventScheduler Gevent排程器,適用於應用透過Gevent的情況。
  • TornadoScheduler Tornado排程器,適用於構建Tornado應用。
  • TwistedScheduler Twisted排程器,適用於構建Twisted應用。
  • QtScheduler Qt排程器,適用於構建Qt應用。
triggers(觸發器)

1、date 觸發器

引數 說明
run_date (datetime 或 str) 作業的執行日期或時間
timezone (datetime.tzinfo 或 str) 指定時區

2、interval 觸發器,固定時間間隔觸發。

引數 說明
weeks (int) 間隔幾周
days (int) 間隔幾天
hours (int) 間隔幾小時
minutes (int) 間隔幾分鐘
seconds (int) 間隔多少秒
start_date (datetime 或 str) 開始日期
end_date (datetime 或 str) 結束日期
timezone (datetime.tzinfo 或str)

3、cron 觸發器,在特定時間週期性地觸發,和Linux crontab格式相容。

引數 說明
year (int 或 str) 年,4位數字
month (int 或 str) 月 (範圍1-12)
day (int 或 str) 日 (範圍1-31)
week (int 或 str) 周 (範圍1-53)
day_of_week (int 或 str) 周內第幾天或者星期幾 (範圍0-6 或者 mon,tue,wed,thu,fri,sat,sun)
hour (int 或 str) 時 (範圍0-23)
minute (int 或 str) 分 (範圍0-59)
second (int 或 str) 秒 (範圍0-59)
start_date (datetime 或 str) 最早開始日期(包含)
end_date (datetime 或 str) 最晚結束時間(包含)
timezone (datetime.tzinfo 或str) 指定時區
job store (作業儲存)

該元件是對排程任務的管理,新增 job 有兩種新增方法,其中一種是 .add_job(), 另一種則是@scheduled_job()裝飾器來修飾函式。

示例1:

# .add_job()

from apscheduler.schedulers.background import BackgroundScheduler
import time


# 定義一個job方法
def job_fun():
  print("this is a work function job")


if __name__ == '__main__':

    # 建立後臺排程器
    scheduler = BlockingScheduler()
    # 新增定時任務,每隔5秒執行一次
    scheduler.add_job(job_fun, 'interval', seconds=5, args=[1], max_instances=3)

    # 啟動排程器
    scheduler.start()

示例2:

import time
from apscheduler.schedulers.blocking import BlockingScheduler

scheduler = BlockingScheduler()

# 每隔 5秒鐘
@scheduler.scheduled_job('interval', seconds=5)
def job1():    
    print('----- this is interval scheduled_job. -----')

# 每隔 10秒鐘
@scheduler.scheduled_job('cron', second='*/10')
def job2():
    print('==== this is cron scheduled_job ====')

scheduler.start()
阻塞和非阻塞
  • APScheduler提供了阻塞和非阻塞兩種排程器型別,BackgroundScheduler和BlockingScheduler,是兩種型別 常用 的排程器,用於建立定時任務。
  • 主要區別:BackgroundScheduler在後臺執行,不會阻塞主執行緒;而BlockingScheduler會阻塞主執行緒直到所有任務完成。

BackgroundScheduler例子

from apscheduler.schedulers.background import BackgroundScheduler
import time


def job():
    print('job 3s')

if __name__=='__main__':

    # BackgroundScheduler呼叫start函式後並不會阻塞當前執行緒,所以可以繼續執行主程式中while迴圈的邏輯。
    sched = BackgroundScheduler(timezone='MST')
    sched.add_job(job, 'interval', id='3_second_job', seconds=3)
    sched.start()

    while(True):  # while會被執行
        print('main 1s')
        time.sleep(1)

BlockingScheduler例子:

from apscheduler.schedulers.blocking import BlockingScheduler
import time

def job():
    print('job 3s')

if __name__=='__main__':

    sched = BlockingScheduler(timezone='MST')
    sched.add_job(job, 'interval', id='3_second_job', seconds=3)
    sched.start()

    while(True): # 不會被執行到
        print('main 1s')
        time.sleep(1)