【发布时间】:2021-03-02 13:39:08
【问题描述】:
我正在使用 FastAPI 和 uvloop 以高效的方式提供 REST API。
我有很多异步代码调用远程资源,例如数据库、存储等,这些函数看起来像这样:
async def _get_remote_resource(key: str) -> Resource:
# do some async work
return resource
我正在实现一个现有抽象基类的接口,我需要在同步方法中使用上面的异步函数。我做了类似的事情:
class Resource:
def __str__(self):
resource = asyncio.run_until_complete(_get_remote_resource(self.key))
return f"{resource.pk}"
太棒了!现在我在 fastapi 中做了一个端点以使这项工作可以访问:
@app.get("")
async def get(key):
return str(Resource(key))
问题是 FastAPI 已经获取并且事件循环正在运行,使用 uvloop,然后异步代码失败,因为循环已经在运行。
有什么方法可以从类中的同步方法调用异步方法吗?还是我必须重新考虑代码的结构?
【问题讨论】:
标签: python asynchronous python-asyncio fastapi