У меня очень трудоемкая задача (обработка изображений), которая получает некоторые входные данные из запроса к конечной точке FastAPI. Для того, чтобы вызывающий абонент реагировал, мне нужно отправить мгновенное ответное сообщение, например «ok», вместе с кодом состояния 201 (последний необязательный).
До сих пор я использовал это:
from fastapi import BackgroundTasks, FastAPI
app = FastAPI()
def main_process(parameters)
...some long task
@app.post('/task')
async def do_task(reference_id: int,
bucket: str,
document_url: str,
return_url: str,
background_tasks: BackgroundTasks):
background_tasks.add_task(main_process, bucket, document_url, reference_id, return_url)
return 'ok'
Каждая задача main_process
загружает изображение из корзины в S3, а затем выполняет некоторую обработку. Решение, показанное выше, работает нормально до тех пор, пока не достигнет примерно 10 изображений, обработанных асинхронно (с заданным asyn c def), и затем произойдет сбой.
Я также пытался увеличить некоторые параметры оружия, например, max-requests
до 100, например:
gunicorn api:app -b 0.0.0.0:8000 -w 4 -k uvicorn.workers.UvicornWorker --preload --max-requests 100 --daemon
, что дало мне больше возможностей для обработки (еще 20 изображений), но все равно происходит сбой.
Я также рассматривал возможность использования Celery или какого-либо решения распределенной очереди задач, но я хочу, чтобы все было как можно проще.
Поскольку асинхронное поведение c не является критическим , но мгновенный ответ таков: возможно ли переключиться на синхронное решение, но сразу получить ответ «ок»?