Async redis 'get' RuntimeError '得到Future< Future pending>附加到不同的循环'

km0tfn4u  于 2023-05-21  发布在  Redis
关注(0)|答案(1)|浏览(279)

我一直在尝试让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=Falseprocesses=2运行应用程序时,它每次都能正常工作。
有没有人想插话,我如何才能强制所有的flask线程使用相同的事件循环?谢谢你。

rekjcdws

rekjcdws1#

我有完全相同的问题和你的临时修复工作,所以谢谢你!
然而,阅读Flask文档中的异步内容(https://flask.palletsprojects.com/en/2.3.x/async-await/),他们说:
异步函数将在事件循环中运行,直到它们完成,在此阶段事件循环将停止。这意味着在async函数完成时尚未完成的任何其他派生任务都将被取消。
然后,他们建议切换到Quart,如果你主要在你的应用程序中做异步工作。当我那样做的时候(对我们来说这是一个简单的更换下降),一切都工作得很完美。

相关问题