如何启动在 FastAPI 中提供响应后不关闭的后台进程

How to spin-up a background process that doesn't close after a response is served in FastAPI

我正在编写一个 web hook 服务器来在我的 git 存储库被推送时接收更新。 在收到来自 GitHub 的 POST 请求后,我执行了几个命令,例如 git pull, mvn install,这需要很长时间。
但是 GitHub 发送的 web hook 请求在 10 秒后超时。
我的代码:

import logging
import os

from fastapi import FastAPI

app = FastAPI()
logger = logging.getLogger("uvicorn")


def exec_cmd(command):
    out = os.system(command)
    logger.info(str(out))


@app.post('/')
def func():
    logger.info("WebHook received")
    exec_cmd("git pull")
    exec_cmd("mvn clean install")
    exec_cmd("killall java")
    return {}


if __name__ == "__main__":
    import uvicorn

    exec_cmd("git pull")
    uvicorn.run("main:app", debug=False, reload=False, host="0.0.0.0")

所以我想运行在后台完成漫长的运行ning任务,尽快响应GitHub的请求。

我该怎么做?
(如果我使 exec_cmd() 函数异步,当请求 returns 时,exec_cmd() 函数不会 运行 直到完成。)

他们是called BackgroundTasks in FastAPI and can be used by adding a BackgroundTasks type to your view function signature

文档中给出的示例可以进一步适应您的需求:

from fastapi import BackgroundTasks, FastAPI

app = FastAPI()


def process_repository(email: str, message=""):
    exec_cmd("git pull")
    exec_cmd("mvn clean install")
    exec_cmd("killall java")


@app.post("/")
async def update_repository(background_tasks: BackgroundTasks):
    background_tasks.add_task(process_repository)
    return {"message": "Repository update has begun"}

由于您不检查结果,这应该适用于您的用例。