我一直在尝试让async redis与async Flask应用程序一起工作,但在我的一生中,我不知道如何解决一个问题。下面是最小可复制代码。
import asyncio
import redis.asyncio as redis
from flask import Flask
async def run_app():
app = Flask('Flask')
pool = redis.ConnectionPool(host='0.0.0.0', port=6379, db=0)
r = redis.Redis(connection_pool=pool)
@app.route('/get', methods=['GET'])
async def get_value():
value = await r.get('key')
return value
if __name__ == '__main__':
asyncio.run(run_app())
请求失败,运行时错误“got Future attached to a different loop”。我认为这是因为flask用两个线程来启动应用程序,每个线程都创建了自己的事件循环。这就是为什么一个请求的行为符合预期,而第二个请求抛出错误并无限重复。当我用threaded=False
和processes=2
运行应用程序时,它每次都能正常工作。
有没有人想插话,我如何才能强制所有的flask线程使用相同的事件循环?谢谢你。
1条答案
按热度按时间rekjcdws1#
我有完全相同的问题和你的临时修复工作,所以谢谢你!
然而,阅读Flask文档中的异步内容(https://flask.palletsprojects.com/en/2.3.x/async-await/),他们说:
异步函数将在事件循环中运行,直到它们完成,在此阶段事件循环将停止。这意味着在async函数完成时尚未完成的任何其他派生任务都将被取消。
然后,他们建议切换到Quart,如果你主要在你的应用程序中做异步工作。当我那样做的时候(对我们来说这是一个简单的更换下降),一切都工作得很完美。