先说结论: flask-apscheduler 中如果要调用 app_context环境的话,用 scheduler.app.app_context
详细过程:
1. 环境与背景,使用Flask 还有flask-apscheduler flask-sqlalchemy 这几个东西重构了一个自己版本的 https://github.com/guomaoqiu/JobCenter 工具,用来管理自己的工作,因为应用使用了 flask-sqlalchemy 所以很多操作要在 flask的app_context中运行,就使用了flask-apscheduler,遇到了 Run time of job xxx was missed by xxx...bug
2. Debug过程:
常见的第一个原因就是多次启动,解决方法也简单 use_reloader 关掉就好了
app.run(host="0.0.0.0", debug=True, use_reloader=False)
但是,偶尔的偶尔 还是出现这个问题,通常都是任务等了很久都没有开始,这块就会出现这个问题...
https://blog.csdn.net/weixin_44786530/article/details/90731800 这位大佬的文章已经讲解了我的整个过程,简单的说就是对APSCHEDULER的配置都没啥用,主要是你启动的东西没起来...
回到我的DEBUG过程,因为程序没有log出来,没有告诉我具体的启动哪里失败了,这就TM很难搞。
看了下代码调用环境时 我用的是 from xxx import app 然后再用 with app.app_context
我发现我开着页面,这个定时任务就能跑,如果我关了所有flask相关页面这东西就跑不起来了....
而且他不是跑起来后报错,就是MISSED,这里我的推测是本身flask-apscheduler 调起一个任务时候,没有加载(或者加载了flask-aps对应的context,而不是想要的全局app的环境),因此如果没有前端页面时候,调用 app.app_context这块就会卡住
在flask-apscheduler 官方文档里其实提了一嘴
https://viniciuschiele.github.io/flask-apscheduler/rst/usage.html 最后一个段落:如果你用flask-apscheduler 调起的任务 需要app_context 的话 应该用 scheduler(对应实例).app.app_context
目前APP已经没有这个需要打开页面才能跑的问题了!