Gunicorn队列:每个唯一ID仅运行1个请求,并且有多个工作程序

时间:2018-09-26 12:10:14

标签: python flask gunicorn

我将GunicornPython Flask结合使用以提供API。它基于在请求正文中以json发送的输入数据返回预测。 json包含一个session_id。从API获得响应最多可能需要10秒钟的时间(它正在计算复杂的ML模型)。

我希望gunicorn并行处理多达4个请求,但每个唯一session_id最多只能处理1个请求。因此,如果给定会话已经发出了一个请求,而该请求仍然很忙,并且对同一会话发出了新请求,则该请求需要等待,直到具有相同session_id的上一个请求完成为止。

我当然可以基于某个包含所有活动请求的session_id的表,以某种方式“锁定”对给定session_ids的请求。但这意味着其中一个工作人员只是在“睡觉”并等待直到另一个请求完成。这不是我想要的解决方案。

我的问题:有没有办法告诉gunicorn服务FIFO,但是每个唯一ID最多只能有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使用4个工作线程来提供API:

gunicorn --bind 0.0.0.0:8000 main:app --workers=4

0 个答案:

没有答案