flask-apscheduler定时任务线程不会释放?
用flask-apscheduler写了个动态添加定时任务的app
测试发现每执行一次定时任务就会生成一个新线程,而且过了一天都不会自动释放
由于这个程序是计划长期运行,这样线程不会释放总感觉不太好
请问是我代码的问题还是有什么办法可以手动释放线程?
试过在joddone函数里面shutdown调度器但是会报错
简化后的代码如下:
app = Flask(__name__)
通知计划任务结果
def jobdone(event):
job_result = event.retval
print("job done:"+job_result)
def test(num):
print("测试"+num)
return num
@app.route('/jobtest',methods=['get'])
def jobtest():
num = request.args.get('num')
start_time=(datetime.datetime.now()+datetime.timedelta(minutes=1))
scheduler.add_job(num,test,args=[num],trigger='date',run_date=start_time)
return "定时任务:"+num
if name == '__main__':
scheduler = APScheduler()
scheduler.api_enabled = True
scheduler.init_app(app)
scheduler.add_listener(jobdone,4096)
scheduler.start()
app.run()
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
当前 flask-apscheduler 最新版本是 1.12.2, 依赖的 apscheduler 版本可以是 3.7.0;
我大致看了下 flask-apscheduler.APScheduler._scheduler 默认是 apscheduler.BackgroundScheduler;这个 BackgroundScheduler 的 default executor 是 apscheduler.executors.ThreadPoolExecutor; 这个 ThreadPoolExecutor 实际使用的是 concurrent.futures.ThreadPoolExecutor.
至此可以确定,apscheduler 中的 job 结束就结束了,但是 executor 创建的 worker thread 还留在 executor.pool 中,由于 apscheduler.ThreadPoolExecutor 没有提供控制其worker生命周期的属性,它就一直运行,也因此你看到一天后 worker thread 还在运行。
如果你想精确控制 job 与 worker thread 的生命周期,就需要自己实现 executor 了。
结论:只要 worker thread 数量没超出 ThreadPoolExecutor(max_workers) 这个限定就表示这个 apscheduler 正常运行 (实际上由于这个executor直接使用的标准库中的ThreadPoolExecutor实现,出bug的机率几乎没有吧)