Python流程控制常用工具详解


Posted in Python onFebruary 24, 2020

在我们的工作中,我们使用ddagent ver。5作为收集工具,收集和报告托管服务器的性能指标,并对ddagent进行一定程度的定制。经过多次功能迭代,发现一批在线运行时间长的托管服务器占用了太多内存。分析问题机器上进程树中每个节点的占用情况,可以看出ddagent集合进程的内存占用仍然很高。

我们将学习最基本的流程控制工具,比如

if 条件判断for 循环while 循环

作为保证业务系统稳定运行的监控组件,存在内存泄漏,这自然是非常严重的,所以我们开始了我们的“故障排除之旅”。

if-elif-else 判断

Python流程控制常用工具详解

分析

有很多工具可以分析和导出Python程序的内存状态。在这里,我们使用pyrasite,它可以附加到正在运行的Python程序,生成内存快照,并检查当前哪些对象类型占用了多少内存,并从大到小排序。

使用命令非常简单: pyrasite-memory-viewer <PID>,同时会生成一份快照文件: /tmp/pyrasite-<PID>-objects.json。

由于无法提供真实的生产数据,下面提到的所有数据都来自问题版本在测试环境中运行12小时后的采样。

在pyrasite提供的Cui视图中,我们可以清楚地看到字典类型的对象实例占用的内存最多,达到3.4mb,有6621个实例:

Python流程控制常用工具详解

while 循环

While循环也是一种常见的循环方式。这种循环通常以循环体类或条件方式结束。它不可能无限期地进行下去。

Python流程控制常用工具详解

对于泄漏情况,我们有以下事实和猜测:

一个或多个位置持续创建空字典对象,并且无法回收它们,从而导致内存泄漏内存泄漏量随时间而增加。在索引收集业务中,泄漏很可能是在每个收集过程中引起的,并在间隔期之后重复触发我们看不到当前依赖的ddagent版本存在尚未关闭的相关问题,这可能是在我们的定制过程中引入的错误

[
 [
 [".../embedded/lib/python2.7/threading.py",774,"__bootstrap","self.__bootstrap_inner()"],
 [".../embedded/lib/python2.7/threading.py",801,"__bootstrap_inner","self.run()"],
 [".../modules/monitor/bot/schedule.py",51,"run","task.run()"],
 [".../modules/monitor/bot/task.py",50,"run","super(RepeatTask, self).run()"],
 [".../modules/monitor/bot/task.py",18,"run","self.check()"],
 [".../modules/monitor/checks/collector.py",223,"wrapper","_check.run()"],
 [".../modules/monitor/checks/__init__.py",630,"run","self._roll_up_instance_metadata()"],
 [".../modules/monitor/checks/__init__.py",498,"_roll_up_instance_metadata","dict((k, v) for (k, v) in self._instance_metadata))"],
 [".../modules/monitor/tracer.py",33,"__init__","self.trace_info = traceback.extract_stack()"]
 ],
 [
 [".../embedded/lib/python2.7/threading.py",774,"__bootstrap","self.__bootstrap_inner()"],
 [".../embedded/lib/python2.7/threading.py",801,"__bootstrap_inner","self.run()"],
 [".../modules/monitor/bot/schedule.py",51,"run","task.run()"],
 [".../modules/monitor/bot/task.py",50,"run","super(RepeatTask, self).run()"],
 [".../modules/monitor/bot/task.py",18,"run","self.check()"],
 [".../modules/monitor/checks/collector.py",223,"wrapper","_check.run()"],
 [".../modules/monitor/checks/__init__.py",630,"run","self._roll_up_instance_metadata()"],
 [".../modules/monitor/checks/__init__.py",498,"_roll_up_instance_metadata","dict((k, v) for (k, v) in self._instance_metadata))"],
 [".../modules/monitor/tracer.py",33,"__init__","self.trace_info = traceback.extract_stack()"]
 ],
 [
 [".../embedded/lib/python2.7/threading.py",774,"__bootstrap","self.__bootstrap_inner()"],
 [".../embedded/lib/python2.7/threading.py",801,"__bootstrap_inner","self.run()"],
 [".../modules/monitor/bot/schedule.py",51,"run","task.run()"],
 [".../modules/monitor/bot/task.py",50,"run","super(RepeatTask, self).run()"],
 [".../modules/monitor/bot/task.py",18,"run","self.check()"],
 [".../modules/monitor/checks/collector.py",223,"wrapper","_check.run()"],
 [".../modules/monitor/checks/__init__.py",630,"run","self._roll_up_instance_metadata()"],
 [".../modules/monitor/checks/__init__.py",498,"_roll_up_instance_metadata","dict((k, v) for (k, v) in self._instance_metadata))"],
 [".../modules/monitor/tracer.py",33,"__init__","self.trace_info = traceback.extract_stack()"]
 ],
...

重播

我们不提“做好设计审查和规范审查”、“加强试验阶段质量检验工作”等“老生常谈”,也值得我们反思。

要彻底防止和控制内存泄漏几乎是不可能的,像rust这样的安全编程语言也不能保证程序不会泄漏内存。

许多引发内存不安全的行为,如数组访问越界、访问释放后的内存等,都可以通过制定更严格的编程模型(如rust提出的所有权+生命周期规则)甚至数据竞争问题来避免。

然而,触发内存泄漏的行为,如竞争条件,需要开发人员将开发组件和业务规则结合起来。设想一个需要手动触发刷新的数据队列。结果,我们在推送数据时忘记调用它。这种内存泄漏无法通过任何常规检查规则来识别。

关键字函数是为了更形象地说明传入参数的位置和具体用法。如果一个函数有四个或五个参数,而且一次传入的参数太多,那么很难让人眼花缭乱。如果key=value用于传入。

总结

通过本节的学习,我们了解了通过if else在不同条件下控制代码流和执行不同代码。for/while和如何定义函数有两种不同的循环方法,包括函数的返回值和参数传递方法、position参数传递和向函数传递参数时的key=value参数传递。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Python编程过程中用单元测试法调试代码的介绍
Apr 02 Python
Python查询阿里巴巴关键字排名的方法
Jul 08 Python
Python编程给numpy矩阵添加一列方法示例
Dec 04 Python
python通过elixir包操作mysql数据库实例代码
Jan 31 Python
深入解析Python小白学习【操作列表】
Mar 23 Python
Django框架验证码用法实例分析
May 10 Python
python绘制已知点的坐标的直线实例
Jul 04 Python
python 多维高斯分布数据生成方式
Dec 09 Python
Python类反射机制使用实例解析
Dec 30 Python
浅谈python opencv对图像颜色通道进行加减操作溢出
Jun 03 Python
keras读取h5文件load_weights、load代码操作
Jun 12 Python
Python制作一个仿QQ办公版的图形登录界面
Sep 22 Python
深入浅析Python 函数注解与匿名函数
Feb 24 #Python
python数据预处理方式 :数据降维
Feb 24 #Python
python实现PCA降维的示例详解
Feb 24 #Python
Python sklearn库实现PCA教程(以鸢尾花分类为例)
Feb 24 #Python
python 线性回归分析模型检验标准--拟合优度详解
Feb 24 #Python
最小二乘法及其python实现详解
Feb 24 #Python
在Python 的线程中运行协程的方法
Feb 24 #Python
You might like
PHP UTF8编码内的繁简转换类
2009/07/20 PHP
PHP魔术方法的使用示例
2015/06/23 PHP
php5.4传引用时报错问题分析
2016/01/22 PHP
详解PHP的Yii框架中组件行为的属性注入和方法注入
2016/03/18 PHP
PHP入门教程之数学运算技巧总结
2016/09/11 PHP
Yii2框架可逆加密简单实现方法
2017/08/25 PHP
jquery教程ajax请求json数据示例
2014/01/13 Javascript
javascript+ajax实现产品页面加载信息
2015/07/09 Javascript
jQuery实用技巧必备(下)
2015/11/03 Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
2017/02/16 Javascript
基于jquery trigger函数无法触发a标签的两种解决方法
2018/01/06 jQuery
vue页面切换到滚动页面显示顶部的实例
2018/03/13 Javascript
vue-cli脚手架搭建的项目去除eslint验证的方法
2018/09/29 Javascript
微信小程序实现登录遮罩效果
2018/11/01 Javascript
基于js Canvas实现二次贝塞尔曲线
2018/12/25 Javascript
微信小程序人脸识别功能代码实例
2019/05/07 Javascript
js如何验证密码强度
2020/03/18 Javascript
[02:01]BBC DOTA2国际邀请赛每日综述:八强胜者组鏖战,中国队喜忧参半
2014/07/19 DOTA
flask中使用SQLAlchemy进行辅助开发的代码
2013/02/10 Python
使用IPython来操作Docker容器的入门指引
2015/04/08 Python
举例讲解Python中的死锁、可重入锁和互斥锁
2015/11/05 Python
Python列表推导式与生成器表达式用法示例
2018/02/08 Python
pandas series序列转化为星期几的实例
2018/04/11 Python
将Dataframe数据转化为ndarry数据的方法
2018/06/28 Python
你应该知道的Python3.6、3.7、3.8新特性小结
2020/05/12 Python
Anaconda详细安装步骤图文教程
2020/11/12 Python
Python将list元素转存为CSV文件的实现
2020/11/16 Python
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/01/13 面试题
师德建设实施方案
2014/03/21 职场文书
初一学生期末评语
2014/04/24 职场文书
食品安全汇报材料
2014/08/18 职场文书
房产公证书样本
2015/01/23 职场文书
Python机器学习之PCA降维算法详解
2021/05/19 Python
Axios代理配置及封装响应拦截处理方式
2022/04/07 Vue.js
华为HarmonyOS3.0强在哪? 看看鸿蒙3.0这7个小功能
2023/01/09 数码科技
clear 万能清除浮动(clearfix:after)
2023/05/21 HTML / CSS