如何管理 Flask 服务中的请求队列?

Sav*_*nda 7 python multiprocessing flask

我正在使用 Flask 从用户那里获取 POST 请求并处理数据而不返回任何响应。

要处理用户请求,我目前拥有的解决方案是:

def process_data(request_data):
    # do_the_processing will process the data 
    do_the_processing(request_data)
    # Terminate the spawned process
    sys.exit(0)

@app.route('/', methods =['POST'])
def index():
    request_data = request.get_json()
    p = Process(target=process_data, args=(request_data,))
    p.start()
    return '200'
Run Code Online (Sandbox Code Playgroud)

但这将为每个用户请求生成一个新进程。如果 1000 个用户同时向服务发出请求会怎样。操作系统将无法处理这么多进程。我准备让用户等到轮到他们进入队列。do_the_processing 方法使用另一个 Web API 来处理数据,然后在内存中写入文件。

我需要维护一个队列,我可以在请求到达时将其放入其中,然后以先到先得的方式处理 request_data。

为了增加处理量,我们可以使用 4 个进程从队列中获取数据并进行处理。处理完数据后,我们将从队列中获取另一个数据并对其进行处理,但问题是我们应该只使用 4 个进程来进行处理。

如果 1000 个用户向服务器发出请求,当前的解决方案将产生 1000 个进程。

我怎样才能实现这种类型的功能,有什么想法吗?

小智 1

我从未找到使用内置队列在进程之间共享工作队列的好方法。我的意思是gunicorn/uwsgi 进程而不是经理/工人。

我的建议是使用 redis 或rabbit mq 之类的东西来分配工作负载。有几种框架可以实现此目的,例如 celery 或仅使用 pika。这将以某种方式构建可扩展的应用程序。能够按照您需要的规模在不同的实例上分发 API、工作队列和工作线程。