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中协程实现TCP连接的实例分析
Oct 14 Python
pygame游戏之旅 创建游戏窗口界面
Nov 20 Python
如何使用Python进行OCR识别图片中的文字
Apr 01 Python
python中时间、日期、时间戳的转换的实现方法
Jul 06 Python
Django 自动生成api接口文档教程
Nov 19 Python
window环境pip切换国内源(pip安装异常缓慢的问题)
Dec 31 Python
jupyter lab文件导出/下载方式
Apr 22 Python
基于django 的orm中非主键自增的实现方式
May 18 Python
Spring http服务远程调用实现过程解析
Jun 11 Python
Python 捕获代码中所有异常的方法
Aug 03 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
Aug 07 Python
Python 如何安装Selenium
May 06 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
复杂检索数据并分页显示的处理方法
2006/10/09 PHP
php判断终端是手机还是电脑访问网站的思路及代码
2013/04/24 PHP
邮箱正则表达式实现代码(针对php)
2013/06/21 PHP
CodeIgniter表单验证方法实例详解
2016/03/03 PHP
浅谈PHP进程管理
2019/03/08 PHP
在 Laravel 项目中使用 webpack-encore的方法
2019/07/21 PHP
layui数据表格自定义每页条数limit设置
2019/10/26 PHP
JavaScript OOP类与继承
2009/11/15 Javascript
动态创建样式表在各浏览器中的差异测试代码
2011/09/13 Javascript
jquery $.ajax相关用法分享
2012/03/16 Javascript
Js Jquery创建一个弹出层可加载一个页面
2014/05/08 Javascript
javascript学习笔记--数字格式类型
2014/05/22 Javascript
JS上传图片前实现图片预览效果的方法
2015/03/02 Javascript
使用Web Uploader实现多文件上传
2016/06/08 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
第一次接触神奇的Bootstrap
2016/10/14 Javascript
AngularJS指令用法详解
2016/11/02 Javascript
webpack 单独打包指定JS文件的方法
2018/02/22 Javascript
webpack v4 从dev到prd的方法
2018/04/02 Javascript
jQuery序列化form表单数据为JSON对象的实现方法
2018/09/20 jQuery
javascript的delete运算符知识点总结
2019/11/19 Javascript
python测试mysql写入性能完整实例
2018/01/18 Python
python简单实现操作Mysql数据库
2018/01/29 Python
python实现list由于numpy array的转换
2018/04/04 Python
解决Python print输出不换行没空格的问题
2018/11/14 Python
python 调用有道api接口的方法
2019/01/03 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
2020/01/03 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
2020/01/18 Python
纯css3制作网站后台管理面板
2014/12/30 HTML / CSS
zooplus意大利:在线宠物商店
2019/08/07 全球购物
大学毕业生自荐书怎么写?
2014/01/06 职场文书
追悼会子女答谢词
2014/01/28 职场文书
庆六一活动总结
2014/08/29 职场文书
个人作风建设总结
2014/10/23 职场文书
音乐研修感悟
2015/11/18 职场文书
小学语文新课改心得体会
2016/01/22 职场文书