Как установить lifetime для gunicorn workers
Имеем проект на FastAPI. Он пока очень слабо нагружен, поэтому через несколько часов простоя получаем ошибку такого рода. Всякие рецепты с pool_recycle и добавление манипуляций в декоратор операций с БД не спасают. Решил пойти в обход -- гасить воркеры каждый час. Набросал такую схему:
main.py
import asyncio
from fastapi import FastAPI
from .workers import worker_shutdown
app = FastAPI()
@app.on_event("startup")
async def worker_lifetime():
loop = asyncio.get_event_loop()
loop.create_task(worker_shutdown())
workers.py
import os
import signal
import asyncio
import random
async def worker_shutdown():
pid = os.getpid()
delay = 3600 + random.randint(2,60)
await asyncio.sleep(delay)
os.kill(pid, signal.SIGTERM)
Всё это работает как задумывалось. Только вопрос, насколько это правильно, не вызовет ли каких-то неожиданных проблем? Была еще мысль с помощью treading вынести worker_shutdown в отдельный поток.