Flask App 不能用一个浏览器处理超过 6 个请求
Flask App can't handle more than 6 requests with a single browser
我正在尝试使用 Flask、OpenCV 制作一个摄像头服务器,通过 Chrome 浏览器显示多个视频处理流媒体结果。
问题
单个浏览器最多可以处理6个请求,但是我需要处理60多个摄像头请求。
我尝试过的东西。
起初我以为 CPU 无法处理超过 6 个输入,但当我从另一个浏览器(chrome、Firefox、Edge 等)请求它时,它可以同时处理更多。所以硬件似乎不是问题。它以某种方式限制了每个浏览器的请求。所以每个浏览器最多只能处理 6 个。
如果我请求超过 6 个,它会开始处理前 6 个请求并等待其中一个完成,然后开始下一个请求。我认为这是因为 Flask 应用程序同步处理进程。
我已经尝试使用 Flask 的 thread=True
选项,以及用于异步进程的 gunicorn。但是没有区别。
gunicorn video:app -w 81 --threads 81 -k gevent --worker-connections 1000
我不知道为什么它仅限于 6 个请求。
有可能解决这个问题吗?
这是该项目的示例代码。
video.py
import cv2
from flask import Flask,request, Response
def loadVideo(video):
cap = cv2.VideoCapture(video)
if cap.isOpened(): # try to get the first frame
rval, frame = cap.read()
else:
rval = False
IMG_SIZE = 640
while(1):
rval, image = cap.read()
image = cv2.resize(image, (IMG_SIZE, IMG_SIZE))
if rval==True:
orig = image.copy()
frame = cv2.blur(image, (3,3))
yield (b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n'+ cv2.imencode('.jpg', frame)[1].tostring() + b'\r\n')
elif rval==False:
break
end = time.time()
cap.release()
app = Flask(__name__)
@app.route('/')
def hello():
return "Server Established!"
@app.route('/detect',methods = ['GET'])
def detect():
try:
if request.method == 'GET':
src = request.args.get('src')
return Response(loadVideo(src),
mimetype = "multipart/x-mixed-replace; boundary=frame")
except Exception as e:
return e
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=3999, threaded=True)
我建议使用 uwsgi 并使用 workers/processes 缩放。
uwsgi --http :9090 --wsgi-file foobar.py --master --processes 4 --threads 2
它的浏览器的 TCP 连接仅限于 6 个。
如何解决这个问题
Firefox 可以在 about:config 中配置,在 network.http 上过滤各种设置; network.http.max-persistent-connections-per-server
是要更改的那个。
ref
但由于这是浏览器的问题,我可能会使用不同的方法,例如使用不同的端口创建相同的服务器。
我正在尝试使用 Flask、OpenCV 制作一个摄像头服务器,通过 Chrome 浏览器显示多个视频处理流媒体结果。
问题
单个浏览器最多可以处理6个请求,但是我需要处理60多个摄像头请求。
我尝试过的东西。
起初我以为 CPU 无法处理超过 6 个输入,但当我从另一个浏览器(chrome、Firefox、Edge 等)请求它时,它可以同时处理更多。所以硬件似乎不是问题。它以某种方式限制了每个浏览器的请求。所以每个浏览器最多只能处理 6 个。
如果我请求超过 6 个,它会开始处理前 6 个请求并等待其中一个完成,然后开始下一个请求。我认为这是因为 Flask 应用程序同步处理进程。
我已经尝试使用 Flask 的 thread=True
选项,以及用于异步进程的 gunicorn。但是没有区别。
gunicorn video:app -w 81 --threads 81 -k gevent --worker-connections 1000
我不知道为什么它仅限于 6 个请求。 有可能解决这个问题吗?
这是该项目的示例代码。
video.py
import cv2
from flask import Flask,request, Response
def loadVideo(video):
cap = cv2.VideoCapture(video)
if cap.isOpened(): # try to get the first frame
rval, frame = cap.read()
else:
rval = False
IMG_SIZE = 640
while(1):
rval, image = cap.read()
image = cv2.resize(image, (IMG_SIZE, IMG_SIZE))
if rval==True:
orig = image.copy()
frame = cv2.blur(image, (3,3))
yield (b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n'+ cv2.imencode('.jpg', frame)[1].tostring() + b'\r\n')
elif rval==False:
break
end = time.time()
cap.release()
app = Flask(__name__)
@app.route('/')
def hello():
return "Server Established!"
@app.route('/detect',methods = ['GET'])
def detect():
try:
if request.method == 'GET':
src = request.args.get('src')
return Response(loadVideo(src),
mimetype = "multipart/x-mixed-replace; boundary=frame")
except Exception as e:
return e
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=3999, threaded=True)
我建议使用 uwsgi 并使用 workers/processes 缩放。
uwsgi --http :9090 --wsgi-file foobar.py --master --processes 4 --threads 2
它的浏览器的 TCP 连接仅限于 6 个。
如何解决这个问题
Firefox 可以在 about:config 中配置,在 network.http 上过滤各种设置; network.http.max-persistent-connections-per-server
是要更改的那个。
ref
但由于这是浏览器的问题,我可能会使用不同的方法,例如使用不同的端口创建相同的服务器。