Очередь Gunicorn: выполнить только 1 запрос на уникальный идентификатор с несколькими рабочими - PullRequest
0 голосов
/ 26 сентября 2018

Я использую 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...