如何在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似乎不会导致讨论此主题的帖子。

我能想到的一种机制可能是:

  1. 在初始请求中发送一个 ID request_id
  2. 当第三方软件运行时,获取其PID并存储键值对request_id:PID
  3. 有第二个端点来接收取消请求。用户将提交request_id他们想要取消的请求。
  4. 使用request_id来杀死具有相应 PID 的子进程。

这看起来很复杂。

以上是如何在FastAPI中取消之前的请求的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>