Python流程控制常用工具和函数定义

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

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

  • if 条件判断
  • for 循环
  • while 循环

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

if-elif-else 判断

分析

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

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

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

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

while 循环

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

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

  • 一个或多个位置持续创建空字典对象,并且无法回收它们,从而导致内存泄漏
  • 内存泄漏量随时间而增加。在索引收集业务中,泄漏很可能是在每个收集过程中引起的,并在间隔期之后重复触发
  • 我们看不到当前依赖的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参数传递。

原文地址:https://www.cnblogs.com/pythoncxy/p/12348549.html

时间: 2024-08-28 22:27:56

Python流程控制常用工具和函数定义的相关文章

JAVA之旅(二)——if,switch,for,while,do while,语句嵌套,流程控制break , continue ,函数,重载的示例总结

JAVA之旅(二)--if,switch,for,while,do while,语句嵌套,流程控制break , continue ,函数,重载的示例总结 JAVA的思想真的很重要,所以要专心的学--献给刚入门的小程序员们 一.语句 一般语句也就三个类型 判断语句 if 选择语句 switch 循环语句 for 当然,还有其他的 我们这里一个一个来讲 1.if if,如果,就是判断,if(条件){} //公共的 类 类名 public class HelloJJAVA { // 公共的 静态 无

python内置常用高阶函数(列出了5个常用的)

原文使用的是python2,现修改为python3,全部都实际输出过,可以运行. 引用自:http://www.cnblogs.com/duyaya/p/8562898.html https://blog.csdn.net/cv_you/article/details/70880405 python内置常用高阶函数: 一.函数式编程 •函数本身可以赋值给变量,赋值后变量为函数: •允许将函数本身作为参数传入另一个函数: •允许返回一个函数. 1.map()函数 是 Python 内置的高阶函数,

五、Python流程控制

Python流程控制 (1)if else语句: a.if语句 Python的if语句类似其他语言.if语句包含一个逻辑表达式,使用表达式比较,在比较的结果的基础上做出决定 Python使用缩进作为其语句分组的方法,建议使用4个空格代替缩进 #!/usr/bin/python if 1<2: print "ok" 逻辑值用来表示诸如:对与错,真与假,空与非空等概念 逻辑值包含了两个值: --True:表示非空的量,所有非零数 --False:表示0,None,空的量等 #!/us

Python流程控制 if / for/ while

在Python中没有switch语句 If语句 if condition: do sth elif condition: Do sth else: Do sth while语句有一个可选的else从句 while condition: do sth else: do sth for循环 for i in range(1, 5):     # 即序列[1, 2, 3, 4] print i else: print 'The for loop is over' break语句 如果你从for或whi

Python基础-Python流程控制

上篇文章 Python基础-基础使用 我们已经知道了Python解释器,Python的变量.和Python的输入输出.Python的注释和字符集,这篇文章,我们主要讲Python的流程控制 本文防盗链:http://python789.blog.51cto.com Python基础-Python流程控制 1.条件判断 1.1.if基本使用 if就是一个条件判断的,当满足不同样的条件的时候执行不同的操作,如法如下: if 条件1:     满足条件1 代码框 elif 添加2:     满足条件2

python 流程控制(条件语句)

1,python流程控制单条件基本语句 2,python流程流程多条件控制语句 1,python流程控制单条件基本语句 if 判断条件: 执行语句-- else: 执行语句-- 判断条件为真,即执行语句,否则执行else中的语句.变量非空或者不为0或者不为None即为真. 例子: #!/usr/bin/env python # -*- coding: UTF-8 -*- n = input('please input number:') if n > 0: print 'n为正数' else:

Linux mysql shell脚本 变量和环境变量 位置参数 预定义变量 运算符 判断 流程控制 for循环 与用户交互 函数

mysql 1. 卸载旧版本 rpm -qa | grep mysql 检查是否有旧版本 查询结果:mysql-libs-5.1.73-7.el6.x86_64 rpm -e mysql-libs 删除旧版本 rpm -e --nodeps mysql-libs 强行删除 2. 安装mysql 2.1 安装源码需要编译 下载c的编译工具 yum -y install make gcc-c++ cmake bison-devel ncurses-devel 2.2 xftp连接上传 xftp连接上

Python流程控制-1 顺序执行

流程控制指的是代码运行逻辑.分支走向.循环控制,是真正体现我们程序执行顺序的操作.流程控制一般分为顺序执行.条件判断和循环控制. 顺序执行 Python代码在执行过程中,遵循下面的基本原则: 普通语句,直接执行: 碰到函数,将函数体载入内存,并不直接执行 碰到类,执行类内部的普通语句,但是类的方法只载入,不执行 碰到if.for等控制语句,按相应控制流程执行 碰到@,break,continue等,按规定语法执行 碰到函数.方法调用等,转而执行函数内部代码,执行完毕继续执行原有顺序代码 if _

Python 流程控制

说到流程控制,其实如果学习了其他语言的话,再学习这些就会觉得很简单了,因为原理都是一样,只是语法变了而已.所以作为一个程序员一定要深入理解过一门语言,学了很多的语言,却不精通其中的一些的话,等于没有学,只能说你所知道的多了一些. 程序的基本流程结构: 顺序结构 选择结构 循环结构 顺序结构是最简单的程序流程,程序根据语句,一句一句的执行,不会遇到逻辑判断或者循环的情况 选择结构: 最简单的选择结构: if True: #statements1 else: #statements2 多分支的选择结