python - 由 gunicorn 运行的 Flask 应用程序在一段时间后被挂起

标签 python python-3.x https server gunicorn

我面临过去 30 天以来的一个独特问题。在尝试了很多东西之后,我正在寻求社区的支持。

我使用 python Flask 制作了一个基于深度学习的 Web 应用程序。后端使用 Python(深度学习代码)编写,前端使用 HTML、JS 和 Bootstrap 提供服务。部署是使用 Gunicorn 完成的。此外,该应用程序启用了 https 并部署在 GCP 上。

应用程序可以正常运行一段时间,然后挂起。尽管 python 进程仍在运行,但它停止为任何 API 请求提供服务和响应。新命中不会到达 python 代码。这种行为在运行时间方面是非常随机的。有时需要 4-5 小时才能停止,有时甚至需要 2 天才能停止。然后我使用 gunicorn 命令手动启动应用程序,它可以工作。

我尝试过的事情 -

  • 使用 htop 检查系统内存当应用程序处于挂起阶段时。但似乎还好。
  • 我尝试使用 Jmeter 测试 API(按顺序在循环中点击多个请求)并且系统没有挂断。
  • 我什至使用 uwsgi + apache 运行该应用程序,但问题仍然存在。

  • 这是用于运行 gunicorn 服务器的命令 -
    gunicorn -b 0.0.0.0:443 --threads=4 --certfile=path_to_certificate_file --keyfile=path_to_key_file server:app --max-requests 1000 --access-logfile /var/log/gunicorn/gunicorn-access.log --error-logfile /var/log/gunicorn/gunicorn-error.log --capture-output --log-level debug --logger-class=simple --daemon
    

    我仍然无法诊断确切的问题并复制它。寻找任何特定的方向来探索。随意分享您的假设/想法。让我知道是否需要我方提供任何其他信息以使其更直观。

    最佳答案

    我在使用 gunicorn/flask 应用程序时也遇到过这个问题:
    请求仅在 gunicorn 启动后的前几分钟内加载。单独放置几分钟后,gunicorn 停止响应请求(浏览器永久显示“加载”图标动画)。 Gunicorn 错误日志什么也没显示。
    我目前的解决方法是从客户端 html 文件创建对 flask 应用程序的任意“保持事件”调用。
    所以在 Flask 应用程序文件中:

    @app.route('/keep_alive/<val>')
    def keep_alive(val):
        return json.dumps({'success':val}) 
    
    在 html 的 JS 块中:
    function keepAlive() {
            var t = setTimeout(keepAlive, 60000);
            var d = new Date();
            var n = d.getTime();
            $.getJSON(base_url + '/keep_alive/' + n.toString(), function (data) {
                    console.log('keep alive return ' + data)
                });
        } 
    keepAlive();
    
    值得一提的是,gunicorn 设置 --keep-alive=21600 没有任何明显的效果。如果这里有人能启发我,那就太好了。
    谢谢

    关于python - 由 gunicorn 运行的 Flask 应用程序在一段时间后被挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56474693/

    相关文章:

    python - 如何通过标识整数转换数据帧列的每个值

    python - 在 Python3 中使用 "not in"比使用 "in"快吗?

    python - 使用 pyCairo 填充带有多个孔的多边形

    curl - 从命令行使用 CURL 的 https 连接

    security - 无法使用自行颁发的客户端证书

    java - 如何连接到通过 <HostVMIP> :2376 using Java? 监听 ssl/tls 连接的 docker 守护进程

    python - 删除mongoDB中的部分数据

    python - 使用矢量将重力添加到弹跳球

    python - 如何在 Python 中对多处理中的 "AttributeError: __exit__"进行故障排除?

    python - BeautifulSoup.find_all() 方法不适用于命名空间标签