如何启动在 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() 函数不会 运行 直到完成。)
文档中给出的示例可以进一步适应您的需求:
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"}
由于您不检查结果,这应该适用于您的用例。
我正在编写一个 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() 函数不会 运行 直到完成。)
文档中给出的示例可以进一步适应您的需求:
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"}
由于您不检查结果,这应该适用于您的用例。