提问人:rafaelHTML 提问时间:10/20/2023 最后编辑:Ulrich EckhardtrafaelHTML 更新时间:11/8/2023 访问量:43
FastAPI 异步运行繁重的计算任务 [重复]
FastAPI run heavy compute task asynchronously [duplicate]
问:
大家好,我在 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() 时都会被阻止
我做错了什么?
答:
0赞
Gman
11/8/2023
#1
您要做的是在向 .()
tcm.run
run_in_threadpool
from starlette.concurrency import run_in_threadpool
case_manager_data = await run_in_threadpool(tcm.run)
这样,你就可以将函数传递给线程池,然后在那里执行。添加意味着在代码本身中内联调用函数。tcm.run
()
评论
//
BackgroundTasks