tl; dr一个用route
装饰的方法无法处理并发请求,而Flask在多个worker和线程启动的gunicorn之后服务,而两个不同的方法处理并发请求的罚款。为什么会出现这种情况,同一条路线如何同时投放?如何让Flask/Gunicorn处理同一路由的并发请求?
我有这个简单的瓶的应用:如果我运行此通过
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正在使用一个线程运行一个工人。
如果通过任一运行此:
gunicorn test:app -w 1 --threads 2
gunicorn test:app -w 2 --threads 1
在这种情况下,在两个不同的接片开放/foo
和/bar
都采取5秒。这是有道理的,因为gunicorn正在运行一个有两个线程的工作者,或者两个工作者各有一个线程,并且可以同时提供两条线路。
但是,如果我同时打开两个/foo
,不管gunicorn的配置如何,第二个标签总是需要10秒。
我怎样才能得到route
装饰同样的方法来服务于并发请求?
有趣的是,最初这种浏览器的连接行为是为了通过避免建立新连接的额外开销来加速加载。但在这种情况下(服务器端处理速度缓慢),我们发现它可能会导致速度放缓。 – MarSoft
我刚刚尝试过Chrome中的一个标签和Firefox中的一个标签,并收到了预期的结果。谢谢你,好的电话。 –