python 程序一次启动有两个进程的问题(flask)

0. 背景

写了一个使用 flask 作为服务框架的程序,发现每次启动程序的时候,使用 ps 都能观察到两个 python 进程。

此外,这个程序占用了 GPU 资源,我发现有两个 python 进程,分别占用了完全相同的 GPU 显存

1. 原因

问题出在 flask 的启动方式上,我启动的时候,是这样启动的

python 复制代码
app.run(debug=True, host='0.0.0.0', port=5000)

查到的资料如下,Flask 中的 debug 参数有以下主要作用:

debug=True 的特性:

  • 自动重载
    • 当源代码文件发生变化时,Flask 服务器会自动重启
    • 适合开发阶段,可以即时看到代码修改的效果
  • 详细的错误页面
    • 当应用出错时,会显示详细的错误信息和调用栈
    • 包含交互式调试器,可以在网页上直接检查变量值
  • 双进程模式
    • 启动一个主进程用于监视代码变化
    • 启动一个子进程用于处理实际请求

debug=False 的特性:

  • 单进程运行
    • 只有一个进程处理请求
    • 代码修改后需要手动重启服务器
  • 简化的错误响应
    • 出错时只返回基本的错误信息
    • 不显示调试信息,更安全

我们看到,当 debug 为 True 的时候,会出现双进程的情况。

2. 解决办法

方案1:将 debug 设置为 False,可以结合环境变量设置线上和开发使用不同的配置

方案2:使用 os.environ.get('WERKZEUG_RUN_MAIN') 来检测执行进程,资源消耗性操作只在单独进程中执行

3. 题外话

  1. 之前开发过程中,还遇到某些版本 flask 启动 debug 为 True 时内存一直泄露的问题
  2. flask 默认的网络服务器为基于 Werkzeug 实现的一个简单的开发服务器,线上环境中问题较多,例如性能较差、安全性不足等。老的版本还出现过并发量较大时服务被打挂无法恢复的问题。
  3. 生产环境,最好使用例如 gunicorn 这样的更专业的服务器来托管 flask 程序。
相关推荐
极小狐12 分钟前
如何使用极狐GitLab 软件包仓库功能托管 ruby?
开发语言·数据库·人工智能·git·机器学习·gitlab·ruby
大G哥12 分钟前
Kotlin Lambda语法错误修复
android·java·开发语言·kotlin
Pythonliu721 分钟前
启智平台调试 qwen3 4b ms-swift
开发语言·swift
zx4324 分钟前
聚类后的分析:推断簇的类型
人工智能·python·机器学习·聚类
RunsenLIu34 分钟前
基于Django实现的篮球论坛管理系统
后端·python·django
行走__Wz38 分钟前
计算机学习路线与编程语言选择(信息差)
java·开发语言·javascript·学习·编程语言选择·计算机学习路线
-代号952742 分钟前
【JavaScript】二十九、垃圾回收 + 闭包 + 变量提升
开发语言·javascript·ecmascript
COOCC144 分钟前
PyTorch 实战:从 0 开始搭建 Transformer
人工智能·pytorch·python·深度学习·算法·机器学习·transformer
谷雪_6581 小时前
鼠标交互初体验:点击屏幕生成彩色气泡(EGE 库基础)
c语言·开发语言·microsoft·交互
sword devil9001 小时前
加速项目落地(Trae编辑器)
python·编辑器·辅助开发