У меня есть приложение, использующее Uvicorn
с FastAPI
. У меня также открыты некоторые связи (например, с MongoDB
). Я хочу изящно закрыть эти соединения, как только появится какой-то сигнал (SIGINT
, SIGTERM
и SIGKILL
).
Мой server.py
файл:
import uvicorn
import fastapi
import signal
import asyncio
from source.gql import gql
app = fastapi.FastAPI()
app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"])
app.mount("/graphql", gql)
# handle signals
HANDLED_SIGNALS = (
signal.SIGINT,
signal.SIGTERM
)
loop = asyncio.get_event_loop()
for sig in HANDLED_SIGNALS:
loop.add_signal_handler(sig, _some_callback_func)
if __name__ == "__main__":
uvicorn.run(app, port=6900)
К сожалению, способ, которым я пытаюсь добиться этого, не работает. Когда я пытаюсь Ctrl+C
в терминале, ничего не происходит. Я считаю, что это вызвано тем, что Uvicorn
запускается в другом потоке...
Каков правильный способ сделать это? Я заметил функцию uvicorn.Server.install_signal_handlers()
, но мне не повезло с ее использованием...
FastAPI позволяет определять обработчики событий (функции), которые необходимо выполнить перед запуском приложения или при завершении работы приложения. Таким образом, вы можете использовать событие shutdown
, как описано здесь:
@app.on_event("shutdown")
def shutdown_event():
# close connections here