我有一个设置,可以使用在 Gunicorn 下运行的 Flask 将视频从网络摄像头流式传输到网络界面。它运行良好 30 秒,然后 Gunicorn 抛出一个工作超时错误。 Gunicorn 使用以下命令启动。
gunicorn3 --bind 0.0.0.0:5001 wsgi_cameras:app
为了确认是 Gunicorn 使工作进程超时并杀死了它,我们使用以下命令启动它:
gunicorn3 --bind 0.0.0.0:5001 --timeout 42 wsgi_cameras:app
使用此命令运行时,工作线程会在 42 秒后超时。
def rear_frames():
while True:
success, frame = rear.read()
if not success:
error_msg = cv2.imread(CAMERA_FAILED_IMG, cv2.IMREAD_UNCHANGED)
ret, buffer = cv2.imencode('.jpg', error_msg)
data = buffer.tobytes()
yield (b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n' + data + b'\r\n')
break
else:
# Resize to standard width and height.
frame = cv2.resize(frame, (FRAME_WIDTH, FRAME_HEIGHT))
# Convert data to bytes and yield result.
ret, buffer = cv2.imencode('.jpg', frame)
data = buffer.tobytes()
yield (b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n' + data + b'\r\n')
@app.route('/rear_feed')
def rear_feed():
return Response(rear_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')
rear_frames()
被定义为发送多部分图像以流式传输视频的生成器,该生成器不应阻止工作人员发送其心跳。成功的视频流证明了该工作人员始终保持活力。
为什么这个设置会导致worker不发送心跳,最终被master杀死?
是否有替代方案可以代表 Flask 应用程序内的工作人员发送心跳?