如何在FastAPI中取消之前的请求
我有一个 FastAPI 应用程序,其端点可能需要进行长时间的计算。作为实际代码的替代,让我使用这个模拟示例,我试图在其中保留我认为相关的功能。
from fastapi import FastAPI
from fastapi.responses import JSONResponse
import subprocess
app = FastAPI()
@app.put("/expensive")
def expensive():
command = "for x in $(seq 1 10000); do echo ${x}; done"
subprocess.run(command, shell=True, check=True)
return JSONResponse(content=True)
if __name__ == "__main__":
import uvicorn
uvicorn.run(
"deleteme:app",
host='0.0.0.0',
port=12345,
reload=True
)
在模拟示例中,实际代码运行第三方软件,该软件执行在某些情况下可能需要很长时间的计算。
当我使用 Postman 发送 PUT 请求时,应用程序将开始打印从1到的自然数10000。我可以在 Postman 中取消请求。但是,应用程序中的计算将继续。
问题:我希望用户能够有一种机制来取消对 的特定请求http://0.0.0.0:12345/expensive。有什么方法可以做到这一点?
我对 Web API 缺乏经验也导致我找不到正确的关键字来搜索该主题。例如,fastapi request abort、 或 的组合web api request cancel似乎不会导致讨论此主题的帖子。
我能想到的一种机制可能是:
- 在初始请求中发送一个 ID
request_id。 - 当第三方软件运行时,获取其PID并存储键值对
request_id:PID。 - 有第二个端点来接收取消请求。用户将提交
request_id他们想要取消的请求。 - 使用
request_id来杀死具有相应 PID 的子进程。
这看起来很复杂。