各位大佬,在flask-apscheduler 進行持久化存盤后,當flask重啟后,如何從mongo中將已存盤的定時任務加載到scheduler中?
1、已完成在flask中的config中進行定時任務設定,代碼如下
class APSchedulerJobConfig(object):
# 定時任務配置
JOBS = [
# 測驗任務
# {
# 'id': 'shop_list',
# 'func': 'app.sched_tasks.add_tasks.task_calls:shop_list',
# 'args': ('shop_list',),
# 'trigger': 'cron',
# 'second': '*/10'
# },
# 生產任務,cron 回圈定時任務,每天定時獲取參與聚劃算商品的資料
{
'id': 'juhuasuan_goods_items_list_cron',
'func': 'app.sched_tasks.add_tasks.task_calls:juhuasuan_goods_items_list',
'args': ('juhuasuan_goods_items_list_cron',),
'trigger': {
'type': 'cron',
'hour': '12', # 每天中午12點啟動
# 'minute': '0',
# 'second': '0'
}
},
# 生產任務,interval 回圈間隔任務,每隔一段時間,啟動聚劃算店鋪監控任務,獲取最新的參與聚劃算的商品
{
'id': 'juhuasuan_shop_list_interval',
'func': 'app.sched_tasks.add_tasks.task_calls:juhuasuan_shop_list',
'args': ('juhuasuan_shop_list_interval', ),
'trigger': 'interval',
# 'seconds': 10 # 每隔10秒執行一次
'minutes': 10 # 每隔10分鐘執行一次
},
# 生產任務:date 一次性任務,當flask系統啟動時,該任務執行一次
# {
# 'id': 'juhuasuan_shop_list_date',
# 'func': 'app.sched_tasks.add_tasks.task_calls:juhuasuan_shop_list',
# 'args': ('juhuasuan_shop_list_date',),
# 'next_run_time': datetime.now() + timedelta(seconds=10)
# },
# 生產任務:date 一次性任務,當flask系統啟動時,該任務執行一次
# {
# 'id': 'juhuasuan_goods_items_list_date',
# 'func': 'app.sched_tasks.add_tasks.task_calls:juhuasuan_goods_items_list',
# 'args': ('juhuasuan_goods_items_list_date',),
# 'next_run_time': datetime.now() + timedelta(seconds=10)
# }
]
config = 'mongodb://{}:{}@{}:{}/{}' # 連接資料庫資訊
config = config.format(
quote_plus(Config.FLASK_DB_MONGO_USER),
quote_plus(Config.FLASK_DB_MONGO_PASSWORD),
Config.FLASK_DB_MONGO_ADDRESS_OA, Config.FLASK_DB_MONGO_PORT, Config.FLASK_DB_MONGO_BI
)
client = MongoClient(config, read_preference=ReadPreference.NEAREST)
SCHEDULER_JOBSTORES = {
'default': MongoDBJobStore(collection='t_bi_sc_apscheduler_jobs', database=Config.FLASK_DB_MONGO_BI, client=client),
'mongo': MongoDBJobStore(collection='t_bi_sc_apscheduler_jobs', database=Config.FLASK_DB_MONGO_BI, client=client)
}
SCHEDULER_EXECUTORS = {
'default': {'type': 'threadpool', 'max_workers': 20}
}
SCHEDULER_JOB_DEFAULTS = {
'coalesce': True,
'max_instances': 3,
'misfire_grace_time': 3600
}
# APScheduler 定時任務開關
SCHEDLER_API_ENABLED = True
# 解決FLASK DEBUG模式定時任務執行兩次
WERKZEUG_RUN_MAIN = True
2、flask:app.__init__.py 中進行scheduler注冊,因為專案使用的gunicorn+gevent啟動worker,所以在注冊scheduler時,使用的是鎖機制,代碼如下:
# 注冊定時任務模塊 APScheduler,使用鎖機制,解決gunicorn創建多個實體
app.config.from_object(APSchedulerJobConfig)
f = open("scheduler.lock", "wb")
try:
fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB)
scheduler.init_app(app)
scheduler.start()
except:
pass
def unlock():
fcntl.flock(f, fcntl.LOCK_UN)
f.close()
atexit.register(unlock)
3、因為使用的是gunicorn,那么每個worker之間不能獲取app的背景關系context,所以,在add_tasks中的__init__.py 中創建了scheduler實體,app.__init__.py 中注冊的時候,引入add_tasks.__init__.py中創建的實體,這樣就解決了背景關系的關系,當其他worker需要使用scheduler.add_job 的時候,引入add_tasks.__init__.py 中的scheduler實體即可獲取context背景關系,代碼如下:
from flask import Blueprint
from flask_apscheduler import APScheduler
sched = Blueprint('sched', __name__)
scheduler = APScheduler()
4、scheduler.add_job的使用,代碼如下:
# 啟動定時任務,一次性任務,修改狀態,把任務添加到任務串列中,系統五分鐘執行一次任務串列,周期性任務
args = (params['task_id'], record['monitor_shop'])
job = {
'id': params['task_id'],
'func': 'app.sched_tasks.add_tasks.task_calls:juhuasuan_shop_data',
'args': args,
'seconds': 10,
}
next_time = datetime.now() + timedelta(seconds=job['seconds'])
scheduler.add_job(
func=job['func'], id=job['id'], args=job['args'],
next_run_time=next_time, jobstore='mongo', replace_existing=True
)
現在的問題是:當我的MongoDB中的資料庫中,如果沒有定時任務的資訊,那么當flask專案啟動時,定時任務就可以正常的啟動,如下圖所示:

但是當我MongoDB中存在任務資訊時,那flask專案重啟時,任務就不能啟動,詳情如下圖所示:

如何在專案重啟時,讓scheduler從MongoDB中獲取以前的定時任務,從而執行定時任務,肯定不能每次啟動flask專案時,都去手動洗掉MongoDB中的定時任務資料,請問各位大佬這個問題如何解決。
uj5u.com熱心網友回復:
別沉啊,暫時來說,解決的方法是,在使用shell腳本啟動專案,在shell腳本中先運行一個py檔案,將原來的存盤任務的資料庫清空,再運行gunicorn啟動專案。但這個給人的感覺不是非常nice,而且還有原來的任務都沒有,所以還是希望專案啟動時,直接從資料庫中獲取原來的任務
uj5u.com熱心網友回復:
解決了沒有,沒有的話我教你uj5u.com熱心網友回復:
配置apscheduler的redis持久化就行,幾行代碼的事,https://blog.csdn.net/weixin_30765577/article/details/96436292可以看一下這個帖子uj5u.com熱心網友回復:
搞笑吧你,你這個是動態任務,mongo也是沒問題的,這個是組態檔配置的任務轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/18197.html
上一篇:Matlab 請問有沒有intlab_V9以上的版本,主要想用到affine arithmetic package,分享一下,感謝
下一篇:Python小白求助!!!
