Я использую Gunicorn
в сочетании с Python Flask
для обслуживания API.Он возвращает прогноз, основанный на входных данных, которые отправляются как json
в теле запроса.json
содержит session_id
.Получение ответа от API может занять до 10 секунд (он рассчитывает сложную модель ML).
Я хочу, чтобы gunicorn
обрабатывал до 4 запросов параллельно, но не более 1 запроса науникальный session_id
.Таким образом, если данный сеанс уже сделал запрос, который все еще занят, и новый запрос для того же сеанса сделан, этот запрос должен ждать, пока предыдущий запрос с тем же session_id
не будет завершен.
Конечно, я могу как-то «заблокировать» запрос для данного session_id
, основываясь на некоторой таблице со всеми session_ids
, у которых есть активные запросы.Но это означает, что один из рабочих просто «спит» и ждет, пока другой запрос не будет выполнен.Это не то решение, которое я ищу.
Мой вопрос: есть ли способ сообщить огнестрельному оружию обслужить FIFO, но с максимум 1 запросом на уникальный идентификатор.Поэтому возьмите следующий запрос в очереди, если gunicorn занят обработкой другого запроса с тем же sessions_id
?
Минимальное рабочее API фляги:
from flask import Flask, jsonify, request
import time
app = Flask(__name__)
@app.route('/predict', methods=['POST'])
def predict():
input_dict = request.get_json()
print('id %s'%(input_dict['id']))
time.sleep(10)
responses = jsonify({'prediction':42})
responses.status_code = 200
return (responses)
Пример ввода:
{
'session_id': 123,
'some_data': 456
}
gunicorn
обслуживает API, используя 4 рабочих:
gunicorn --bind 0.0.0.0:8000 main:app --workers=4