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

时间:2018-03-24 05:51:57

标签: 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个进程。

我如何实现这类功能,任何想法?

1 个答案:

答案 0 :(得分:1)

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

我的建议是使用像redis或rabbit mq这样的东西来分配工作量。有几个框架,如芹菜或只使用鼠兔。这将构建一个可扩展的应用程序 办法。能够以您需要的规模在不同的实例上分发API,工作队列和工作人员。