flask_apscheduler

在項目中需要用到 apscheduler, 查了一些資料, 大概知道其運行原理之後模擬實際運用場景來測試代碼.

運用場景:

在項目中需要隨機的插入job, 相當與做一個回調一樣. 然後運行job, 每個job做的事情基本上都是一樣的, 根據參數的不同來執行不同的操作, 所以沒一個job實際上都是會使用相同的一個函數(回調函數)

TASK.py

下面這個文件中定義了job需要怎麼運行, 以及可以根據Jobs class 來返回調用函數的函數名, 有多個不同的, 此處只有一個,所以直接用了一個staticmethod

from flask_apscheduler import APScheduler
import time

scheduler = APScheduler()

def testASP(param):
    print(param)

class Jobs():
    def __init__(self):
        pass

    @staticmethod
    def get_func():
        return __name__ + ':' + 'testASP'


route.py

在這個文件中, 本來是想引入app,然後定義一個@app.route("/aps"), 但是由於引入的問題, app不能在此定義一個新的路由. 所以只用了一個方法來代替

from APSTASK import Jobs, scheduler
from datetime import datetime, timedelta


def routing():
    print("routing")
    job = Jobs.get_func()
    j = scheduler.add_job(id='test4', func=job, trigger='date', run_date=datetime.now() + timedelta(seconds=30), args=[11])
    print(j)
    return

test.py

這個文件中初始化了,flask, 還有scheduler

# -*-coding:utf-8-*-
from flask import Flask
# from flask_apscheduler import APScheduler
from APSTASK import Jobs, scheduler
from datetime import datetime, timedelta
import route
import logging

logging.basicConfig()
logging.getLogger('apscheduler').setLevel(logging.DEBUG)

SCHEDULER_API_ENABLED = True

app = Flask(__name__)

@app.route('/')
def index():
    job = Jobs()
    j = scheduler.add_job(id='test3', func=job.func, trigger='date', run_date=datetime.now()+timedelta(seconds=10), args=[8])
    print(j)
    route.routing()
    return '<h1>Hello world!</h1>'


if __name__ == '__main__':
    scheduler.init_app(app)

    job = Jobs()
    print(job.func)

    scheduler.add_job(id='test', func=job.func, trigger='date', run_date=datetime.now()+timedelta(seconds=5), args=[5], max_instances=100)
    scheduler.add_job(id='test2', func=job.func, trigger='date', run_date=datetime.now()+timedelta(seconds=10), args=[10], max_instances=100)
    # scheduler.add_job(id='test1', func=job.func, trigger='interval', seconds=3, args=['interval'])
    scheduler.start()
    app.run(debug=True, use_reloader=False)

總結:

似乎是python的一個問題, 如果將scheduler在test.py 中進行引入和初始化, 然後在別的文件裏面從這裏引入, 最後就會產生一個全新的scheduler, 添加的job是一個pending狀態. 所以需要在定義jobs的文件中引入 scheduler,然後在入口文件中進行初始化,這樣不論在哪裏import scheduler, 都將是同一個. 該測試證明了下面幾點:

1. 在scheduler.start()以後也可以再添加任務

2. 動態添加任務可以自定義參數, 這樣就比較靈活,避免了使用interval 作爲trigger, 不斷地去執行的問題了.

3. 可以在工程的任意地方動態添加任務,這樣就不用在程序的開始寫要運行的job了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章