简述:使用route
修饰的方法在Flask被部署在多个worker和thread的gunicorn后无法处理并发请求,但是两个不同的方法可以正常处理并发请求。为什么会出现这种情况?如何使相同的路由可同时处理请求?
我有一个简单的Flask应用程序:
from flask import Flask, jsonify
import time
app = Flask(__name__)
@app.route('/foo')
def foo():
time.sleep(5)
return jsonify({'success': True}), 200
@app.route('/bar')
def bar():
time.sleep(5)
return jsonify({'success': False}), 200
如果我通过以下方式运行:
gunicorn test:app -w 1 --threads 1
如果我在浏览器中快速打开两个不同的选项卡分别进入 /bar
和 /foo
,那么先按回车的选项卡将在5秒内加载,第二个则需要10秒。这是因为gunicorn只运行一个拥有一个线程的worker。
如果我通过以下任一方式运行它:
gunicorn test:app -w 1 --threads 2
gunicorn test:app -w 2 --threads 1
在这种情况下,同时在两个不同的选项卡中打开/foo
和/bar
都需要5秒钟。这是有道理的,因为gunicorn要么运行带有两个线程的1个工作进程,要么运行具有每个线程的1个工作进程,因此可以同时提供两个路由。然而,如果我同时打开两个
/foo
,无论gunicorn配置如何,第二个标签页始终需要10秒钟。如何使被
route
修饰的相同方法能够提供并发请求?