Python Flask Web 应用程序在多次调用时挂起

Python Flask web application hanging when called multiple times

我使用 Flask 创建了一个 Web 应用程序,以便通过 HTTP 请求触发检测例程。

基本上,每次向端点发送 GET 请求时 URL,我都希望执行一个函数。
我使用的代码是:

web_app = Flask(__name__)


@web_app.route('/test/v1.0/run', methods=['GET'])
def main():
    cap = cv2.VideoCapture(0)
    cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)

    while(True):
        ret, frame = cap.read()

        ***performing operations on each frame and running ML models on them***

    return ('', 204)

if __name__ == '__main__':
    web_app.run(debug=True)

第一次一切正常,如果我使用:

curl -i http://localhost:5000/test/v1.0/run

执行函数main(),最后将结果上传到在线数据库。
此后,程序继续监听 URL。如果我发送另一个 GET 请求,main() 会再次执行,但它会在 while 循环的第一次迭代后挂起。

我简单地 运行 多次尝试将相同的代码放在 for 循环中:

for i in range(10):
    cap = cv2.VideoCapture(0)
    cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)

    while(True):
        ret, frame = cap.read()

        ***performing operations on each frame and running ML models on them***

它工作没有任何问题,所以挂起不应该依赖于我在代码中所做的任何事情。
问题应该是我是用flask来触发函数导致的,但在这种情况下我不明白为什么main()在启动后会挂起。一般来说,我对 Flask 和 Web 应用程序还很陌生,所以我可能在这里遗漏了一些非常简单的东西。

问题是我还使用

显示从相机收集的帧
cv2.imshow("window", frame)

并且,即使在程序结束时我通过以下方式关闭所有内容:

cap.release()
cv2.destroyAllWindows()

有些事情仍然悬而未决,它让流程在下一次迭代中停滞不前。 我通过删除 cv2.imshow 来解决......我真的不需要可视化流,所以我可以接受它。 不过,主要是出于好奇,我将尝试弄清楚即使在可视化视频帧时如何使其工作。