Python Gunicorn队列:每个唯一id仅运行1个请求,具有多个工作进程

Python Gunicorn队列:每个唯一id仅运行1个请求,具有多个工作进程,python,flask,gunicorn,Python,Flask,Gunicorn,我正在使用Gunicorn和Python Flask来提供一个API。它根据请求体中作为json发送的输入数据返回预测。json包含一个会话id。从API(它正在计算一个复杂的ML模型)获得响应可能需要大约10秒的时间 我希望gunicorn能够并行处理多达4个请求,但每个唯一的会话id最多只能处理1个请求。因此,如果给定的会话已经发出了一个仍然繁忙的请求,并且为同一会话发出了一个新的请求,那么该请求需要等待,直到具有相同会话id的前一个请求完成 当然,我可以通过某种方式“锁定”给定会话id的请

我正在使用
Gunicorn
Python Flask
来提供一个API。它根据请求体中作为
json
发送的输入数据返回预测。
json
包含一个
会话id
。从API(它正在计算一个复杂的ML模型)获得响应可能需要大约10秒的时间

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

当然,我可以通过某种方式“锁定”给定
会话id的请求,基于某个表,该表包含所有具有活动请求的
会话id
。但这意味着其中一个工人只是在“睡觉”,等待另一个请求完成。这不是我正在寻找的解决方案

我的问题:有没有办法告诉gunicorn提供FIFO,但每个唯一id最多有一个请求。因此,如果gunicorn正忙于处理另一个具有相同
会话\u 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

当给定会话ID的预测正在进行时,是否可以拒绝请求?否则请求只会阻塞工作进程。这意味着发出请求的服务必须是“聪明的”,而不是gunicorn的队列。如果我们只是拒绝,当然可以,但不完全是对问题的回答。你对这个方法有什么结论吗?