FastAPI 异步运行繁重的计算任务 [重复]

FastAPI run heavy compute task asynchronously [duplicate]

提问人:rafaelHTML 提问时间:10/20/2023 最后编辑:Ulrich EckhardtrafaelHTML 更新时间:11/8/2023 访问量:43

问:

大家好,我在 fastapi 端点上运行繁重的计算任务时遇到了问题。

@app.post("/run/")
async def run_cases(data: List[schemas.TestID], db: orm.Session = Depends(services.get_db)):
try:
   CONTAINER.create()
   tcm = TestManager(CONTAINER, data) # this is a Class that's does all my data parsing

   case_manager_data = tcm.run()
        
   for x in case_manager_data.result():
       services.create_result(db=db, result=schemas.Result(**x))

except Exception as ex:
    raise ex

return True

这是我的“库存”端点,我正在向它传递使用类 TestManager 计算的数据。

但是,当我发送此数据时,整个应用程序会停止,直到我从 tcm 获得结果。我无法转到任何其他端点等...(我的所有端点都是使用 async def 创建的)

所以我试过了

from starlette.concurrency import run_in_threadpool
data = await run_in_threadpool(tcm.run())

import asyncio
loop = asyncio.get_running_loop()
data = await loop.run_in_executor(None, tcm.run())

from fastapi.concurrency import run_in_threadpool
await run_in_threadpool(tcm.run())

但是每次行为保持不变时,应用程序在运行 tcm.run() 时都会被阻止

我做错了什么?

我一直在研究的帖子 第一 第二 第三

Python 多线程 异步 并发 FastAPI

评论

0赞 Ulrich Eckhardt 10/20/2023
请不要在 Python 中使用注释,例如,它会弄乱此处突出显示的语法。//
0赞 Spike Lee 10/26/2023
如果要异步运行并运行繁重的作业,请使用 或 CeleryBackgroundTasks

答:

0赞 Gman 11/8/2023 #1

您要做的是在向 .()tcm.runrun_in_threadpool

from starlette.concurrency import run_in_threadpool
case_manager_data = await run_in_threadpool(tcm.run)

这样,你就可以将函数传递给线程池,然后在那里执行。添加意味着在代码本身中内联调用函数。tcm.run()