apscheduler後臺任務按照不同週期執行
阿新 • • 發佈:2019-01-23
之前有一個需求,需要對原有的後臺任務按照高低峰期的方式去執行,我們都知道apscheduler有三種觸發器,date(只執行一次),interval(根據指定的間隔時間迴圈執行),cron(給定特定的時間範圍,使任務在這個週期去執行)。那麼根據需求我們選擇cron觸發器,因為它可以指定時間範圍。
關於怎麼使用觸發器,這裡就不贅述了,本篇文章的主要重心在於我們需要在對應的時間丟擲對應的觸發器,交給後臺任務。
獲取觸發器
我們的需求是要使得後臺任務在規定的高低峰期按照對應的觸發器去執行,那麼怎麼才能夠讓任務拿到準確地觸發器呢,這裡定義了一個類:
from apscheduler.triggers. base import BaseTrigger
class MultiCronTrigger(BaseTrigger):
triggers = []
def __init__(self,triggers):
self.triggers = triggers
def get_next_fire_time(self, previous_fire_time, now):
min_next_fire_time = None
for trigger in self.triggers:
# 從trigger物件中取出下一個要執行的時間點,與當前時間對比
next_fire_time = trigger.get_next_fire_time(previous_fire_time,now)
if next_fire_time is None:
continue
if min_next_fire_time is None:
min_next_fire_time = next_fire_time
if next_fire_time < min_next_fire_time:
min_next_fire_time = next_fire_time
return min_next_fire_time
這個類方法就是我們將多個觸發器放入佇列中,在呼叫類時,會根據業務邏輯取出當前時間點,和每個排程器的下一個執行節點進行比對,哪個執行節點是最接近當前的,就會丟擲這個執行節點
寫好的這個方法,後面執行要在使用的過程中將觸發器放入佇列,自然會丟擲最適合的交給後臺任務
制定觸發器
cron的用法可以參考文件,我這裡是參考這篇文章的=>地址
from apscheduler.triggers.cron import CronTrigger
#高峰期,每天早六點到晚七點,每兩分鐘執行一次
trigger1 = CronTrigger(hour='6-19',minute='*/2',jitter=30)
#低峰期,每天晚八點至第二天早上六點,每五分鐘執行一次
trigger2 = CronTrigger(hour='20-23,0-5',minute='*/5',jitter=30)
其中jitter這個引數的作用是:當我們有多個後臺任務執行時,如果同一時間點有多個任務時,有了這個jitter引數,它會使每個任務提前或延後+30/-30秒範圍去執行
新增任務
from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler() #一般用於做後臺任務
scheduler.add_job(任務,trigger=MultiCronTrigger([trigger1,trogger2]))
新增好任務就可以執行了,這樣任務就會在高低峰期按照我們規定好的執行頻率去執行。