可能的PythonFlask内存泄漏

2024-09-29 19:21:10 发布

您现在位置:Python中文网/ 问答频道 /正文

希望有人能帮我解决这个问题。 我在docker容器中运行了一个非常简单的Flask服务器,它在每次调用/api/feed_image端点时都接受一个新帧。通过该端点的图像然后从/video_feed流到index.html

应用程序最初的工作方式与预期的一样,但是,当我看到使用docker stats消耗资源时,内存使用率缓慢攀升,直到整个系统崩溃。 有人知道我可能错过了什么或有什么建议吗

谢谢

import os
import sys

from azure.iot.device.aio import IoTHubModuleClient
from flask import Response
from flask import request
from flask import Flask
from flask import render_template
import datetime
import time
import numpy as np
import cv2
import queue

frameQueue = queue.Queue()
app = Flask(__name__)

@app.route("/")
def index():
    return render_template("index.html")

@app.route("/video_feed")
def video_feed():
    print(len(frameQueue))
    return Response(generate(), mimetype="multipart/x-mixed-replace; boundary=frame")

@app.route("/api/feed_image", methods=['POST'])
def read_image():

    r = request
    nparr = np.fromstring(r.data, np.uint8)

    frameQueue.put(cv2.imdecode(nparr, cv2.IMREAD_COLOR))

def generate():
    global frameQueue
    while True:
        outputFrame = frameQueue.get()
        if outputFrame is None:
            continue
        
        (flag, encodedImage) = cv2.imencode(".jpg", outputFrame)

        if not flag:
            continue
        yield(b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n' + bytearray(encodedImage) + b'\r\n')


if __name__ == "__main__":
    app.run(host='0.0.0.0', port='5001', debug=True, threaded=True, use_reloader=False)

Tags: fromimageimporttrueappflaskindexdef
1条回答
网友
1楼 · 发布于 2024-09-29 19:21:10

过了很长时间,我解决了自己的问题。 事实证明,因为我在read_image()结尾没有返回响应对象,Flask生成了一个异常,该异常一定是在后台缓存的:

172.18.0.4 - - [22/Apr/2021 00:09:25] "POST /api/feed_image HTTP/1.1" 500 -
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2450, in wsgi_app
    response = self.handle_exception(e)
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1867, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1953, in full_dispatch_request
    return self.finalize_request(rv)
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1968, in finalize_request
    response = self.make_response(rv)
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2098, in make_response
    "The view function did not return a valid response. The"
TypeError: The view function did not return a valid response. The function either returned None or ended without a return statement.

添加return语句解决了这个问题

@app.route("/api/feed_image", methods=['POST'])
def read_image():
    
    ...

    return Response(status=201)

也许有人会解释为什么会发生这种情况? 不管怎样,我希望这能帮助别人

相关问题 更多 >

    热门问题