在項目中需要用到 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了