什么是在Flask应用中运行asyncio事件循环的最佳方法?
我的 main.py 文件看起来像这样:
为了添加异步任务的选项,我需要在运行应用程序之前创建一个
我能找到的唯一解决方案是在finally块的末尾添加
我的 main.py 文件看起来像这样:
if __name__ == '__main__':
try:
app.run(host='0.0.0.0', port=8000, debug=True)
except:
logging.critical('server: CRASHED: Got exception on main handler')
logging.critical(traceback.format_exc())
raise
为了添加异步任务的选项,我需要在运行应用程序之前创建一个
event_loop
,但即使停止应用程序运行,后台线程仍然挂起(在调试器中可观察到)。if __name__ == '__main__':
try:
app.event_loop = asyncio.get_event_loop()
app.run(host='0.0.0.0', port=8000, debug=True)
except:
logging.critical('server: CRASHED: Got exception on main handler')
logging.critical(traceback.format_exc())
raise
finally:
app.event_loop.stop()
app.event_loop.run_until_complete(app.event_loop.shutdown_asyncgens())
app.event_loop.close()
可以使用以下方法创建异步任务:
def future_callback(fut):
if fut.exception():
logging.error(fut.exception())
def fire_and_forget(func, *args, **kwargs):
if callable(func):
future = app.event_loop.run_in_executor(None, func, *args, **kwargs)
future.add_done_callback(future_callback)
else:
raise TypeError('Task must be a callable')
我能找到的唯一解决方案是在finally块的末尾添加
exit()
,但我认为这不是正确的解决方案。