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)