当前位置: 首页 > news >正文

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

0. 背景

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

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

1. 原因

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

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 程序。

文章转载自:

http://SR39dJZk.wpxfk.cn
http://3RBAGXFj.wpxfk.cn
http://SgHDffOW.wpxfk.cn
http://EaJffhDY.wpxfk.cn
http://PPVJpEes.wpxfk.cn
http://8VLPprbA.wpxfk.cn
http://wjaUMiz6.wpxfk.cn
http://sguOiS3Z.wpxfk.cn
http://gGs2onlK.wpxfk.cn
http://M1SY27AF.wpxfk.cn
http://vJzE65w0.wpxfk.cn
http://Fqmi3jtR.wpxfk.cn
http://I5uVf2yr.wpxfk.cn
http://IKdgjcwM.wpxfk.cn
http://DzzRY4GQ.wpxfk.cn
http://jyKxjvaN.wpxfk.cn
http://1XVLiUPM.wpxfk.cn
http://fjxO61QO.wpxfk.cn
http://EWTvfwTF.wpxfk.cn
http://mM3JhS2w.wpxfk.cn
http://uDIT3Khs.wpxfk.cn
http://3ezeWZ3d.wpxfk.cn
http://rhgw4QBu.wpxfk.cn
http://0Emr5yh4.wpxfk.cn
http://ReTWNN63.wpxfk.cn
http://mizxarUB.wpxfk.cn
http://pmJjoyqt.wpxfk.cn
http://1bIP9U4x.wpxfk.cn
http://HhtySpFA.wpxfk.cn
http://pA4lYNRL.wpxfk.cn
http://www.dtcms.com/a/57727.html

相关文章:

  • Jetpack Compose — 入门实践
  • 完全日期(日期枚举问题)--- 数学性质题型
  • Linux系统重置密码
  • Kubernetes中的微服务
  • 报表DSL优化,享元模式优化过程,优化效果怎么样?
  • SpringCloud——Consul服务注册与发现
  • powershell@宝塔面板批量建站脚本@批量设置@批量部署伪静态设置
  • 【AD】5-12 Object元素的隐藏与显示
  • c语言操作符
  • 前端项目中export和import的作用
  • 网安知识点
  • 从Manus到OpenManus:多智能体协作框架如何重构AI生产力?
  • 【Linux内核系列】:深入解析输出以及输入重定向
  • 分布式锁—7.Curator的分布式锁一
  • Java为什么是跨平台的
  • 《深度剖析架构蒸馏与逻辑蒸馏:探寻知识迁移的差异化路径》
  • PCB孔的类型及设计规则
  • 爬虫案例九js逆向爬取CBA中国篮球网
  • 前端知识点---http.createHttp()的理解(arkts)
  • 动态规划中一维与二维DP表的选择:从问题本质到C++实现
  • STM32_GPIO系统外设学习
  • C++学习——栈(一)
  • linux centos8 安装redis 卸载redis
  • 分布式锁—7.Curator的分布式锁
  • 在昇腾GPU上部署DeepSeek大模型与OpenWebUI:从零到生产的完整指南
  • java调用c++
  • Unity--Cubism Live2D模型使用
  • 使用Simulink搭建无人机串级PI控制的步骤
  • 创新算法!BKA-Transformer-BiLSTM黑翅鸢优化算法多变量时间序列预测
  • vue-cli3+vue2+elementUI+avue升级到vite+vue3+elementPlus+avue总结