FastAPI异步接口并行请求耗时偏高及CPU密集型任务扩展问题咨询
问题解答
额外耗时来源确认
你的判断是对的,额外耗时确实是异步拉取数据后CPU密集型任务串行执行导致的。
Python异步框架的事件循环运行在单线程上,使用异步数据库连接时,10个请求的数据库IO操作可以并发执行,这部分总耗时仅需约1秒就能全部完成。但拉取数据后的CPU密集型运算必须在事件循环的单线程中按顺序执行,10个任务每个耗时0.5秒,累计计算耗时就是5秒,和你实测的总耗时完全匹配。你预期的1.5秒需要IO和CPU任务都完全并行才能实现,单进程异步架构下CPU任务无法并行,自然达不到预期值。
多worker扩展有效性说明
增加Uvicorn的worker进程数确实可以扩展CPU bound部分的处理能力。每个worker进程会运行独立的事件循环,且拥有独立的GIL锁,在多核CPU环境下,不同worker的CPU计算任务可以真正并行执行。例如你在4核CPU上将worker数设置为4,10个请求的计算任务会分散到4个进程并行处理,计算部分总耗时可降低到1.5秒左右,整体请求总耗时即可接近你预期的1.5秒。
如果暂时不方便调整worker数量,也可以选择将CPU bound的运算任务提交到concurrent.futures.ProcessPoolExecutor中执行,避免阻塞事件循环,同样可以实现单worker下CPU任务的并行处理。
内容的提问来源于stack exchange,提问作者sambal shikhar
相关产品推荐
相关产品推荐

