Я пишу сервер веб-хук для получения обновлений при отправке моего репозитория git.
Получив POST-запрос от GitHub, я выполняю несколько команд, таких как git pull, mvn install, которые занимают очень много времени.
Но запрос веб-хука, отправленный GitHub, истекает через 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")
Поэтому я хочу запускать длительные задачи в фоновом режиме и отвечать на запрос GitHub как можно скорее.
Как я могу это сделать?
(Если я сделаю функцию exec_cmd() асинхронной, когда запрос вернется, функция exec_cmd() не запустится до завершения.)






Это называется BackgroundTasks в FastAPI и может использоваться путем добавления типа BackgroundTasks в сигнатуру функции просмотра..
Пример, приведенный в документации, может быть дополнительной адаптацией к вашим потребностям:
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"}
Поскольку вы не проверяете результаты, это должно работать для вашего варианта использования.
это отвечает на ваш вопрос?