Как установить 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 в отдельный поток.


Ответы (0 шт):