我将Gunicorn
与Python 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