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

时间:2020-09-21 14:26:21

标签: python flask web-application-design

我使用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应用程序还很陌生,所以这里可能缺少一些非常简单的内容。

1 个答案:

答案 0 :(得分:0)

问题是我还使用

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

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

cap.release()
cv2.destroyAllWindows()

某些东西仍然挂着,使进程陷入了下一次迭代。 我通过删除cv2.imshow解决了...我真的不需要可视化流,因此我可以使用它。 不过,通常出于好奇,我会尝试找出如何使它即使在可视化视频帧时也能正常工作。