Quart异步路由中如何获取同步代码执行后的请求对象?
问题:Quart异步路由中使用run_sync无法获取同步函数返回值?
你遇到的问题很典型——run_sync的作用是把同步函数包装成异步可等待对象,而不是直接执行同步函数并返回结果。你现在的代码只是拿到了包装后的函数对象,自然打印的是函数的内存地址。
修正方案:添加await关键字
只需要对run_sync的调用结果使用await,就能获取到sync_processor返回的request对象了:
import requests from quart import Quart from quart.utils import run_sync app = Quart(__name__) def sync_processor(): request = requests.get('https://api.github.com/events') return request @app.route('/') async def test(): # 关键:添加await来等待异步包装后的同步函数执行完成 result = await run_sync(sync_processor) print(result.json()) # 可以直接打印返回的JSON数据验证 return "test" if __name__ == '__main__': app.run()
为什么这样有效?
run_sync(func)会把同步函数func包装成一个异步函数,这个函数会在Quart的线程池中执行,避免阻塞事件循环。- 因为它是异步可等待对象,所以必须用
await来等待它执行完毕,才能拿到func的返回值。如果不加await,你得到的只是这个包装后的函数本身,而不是执行结果。
额外提示:带参数的同步函数
如果你的同步函数需要传入参数,直接在run_sync后面追加即可:
def sync_processor(url): request = requests.get(url) return request # 在路由中调用 result = await run_sync(sync_processor, 'https://api.github.com/events')
内容的提问来源于stack exchange,提问作者acG
相关产品推荐
相关产品推荐

