peewee 会阻塞 fastapi 的 异步协程吗
在使用 fastapi + uvicorn
组合的时候,代码是异步协程再跑。我在选用数据库 ORM
的时候,更加熟悉 peewee
,但是 peewee
是同步的,使用 peewee
操作数据库的时候,会把 fastapi
进程阻塞吗?
为什么会有疑问,因为有猴子补丁,fastapi + uvicorn
对应的猴子补丁可以把 peewee
转成不阻塞吗?
回答:
个人之见,异步并不适合数据库,但是适合网络操作。
数据库处理是有瓶颈的,就算你再怎么异步,最终业务瓶颈都在数据库这里了
回答:
参考:uvicorn 如何调节线程池大小
自问自答吧
这个问题提出时间是一年多前了,那个时候使用 fastapi 没多久,对异步的概念也不是很清楚
fastapi 有这样的机制:
- 如果你的视图函数没有加 async 关键字,那么你的视图函数会被丢到线程池中去运行,也就是多线程
@app.get("/")def sync_function():
# 在这里,你可以随便用 peewee 等同步的库,因为我们没有在 def sync_function 前面加 async,所以 fastapi 会把这个函数丢到线程中去跑,是同步执行的(这个线程池最大容量应该是 40)
- 如果你的视图函数加了 async 关键字,那么这个视图函数就会被异步执行,也就是协程,这个时候如果想在这个异步视图里面执行同步阻塞的函数就必须要用专门的东西了,不然麻烦多多,容易让进程卡住
@app.get("/")async def async_function():
result = await run_in_threadpool(my_blocking_function, arg)
# 处理结果
...
所以,只要不给视图函数加 async,我们就可以放心大胆的在 fastapi 中使用 peewee
以上是 peewee 会阻塞 fastapi 的 异步协程吗 的全部内容, 来源链接: utcz.com/p/938279.html