python - 如何在我的 Flask 服务中管理请求队列?

标签 python flask multiprocessing

我正在使用 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'

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

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

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

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

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

最佳答案

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

我的建议是使用像 redis 或 rabbit mq 这样的东西来分配工作负载。有几个框架可以做到这一点,例如 celery 或仅使用 pika。这将使您的应用程序在 方式。能够按您需要的规模在不同的实例上分发 API、工作队列和工作人员。

关于python - 如何在我的 Flask 服务中管理请求队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49461727/

相关文章:

python - 为什么Flask读取大文本文件不占内存?

python - python函数如何调用并且不等待它完成处理,而该函数必须被调用一次。因此,线程必须停止

python - 使用多处理模块进行集群计算

python - 使用外部命令多重处理数千个文件

python - Emacs autocomplete.el 中的 Python 快速帮助?

python - 在pandas中如何根据相同的ID迭代两个数据框

python - 为 argparse 子命令提供更好的帮助

javascript - AJAX 调用成功后,Toastr Growl 未显示

python - 在 Flask 中捕获 http 状态代码

Python Flask : keeping track of user sessions? 如何获取 Session Cookie ID?