flask-apscheduler定时任务线程不会释放?

发布于 2022-09-13 00:33:37 字数 914 浏览 36 评论 0

用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

归途 2022-09-20 00:33:37

当前 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的机率几乎没有吧)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文