python清理子进程机制剖析


Posted in Python onNovember 23, 2017

起步

在我的印象中,python的机制会自动清理已经完成任务的子进程的。通过网友的提问,还真看到了僵尸进程。

import multiprocessing as mp
import os
import time
def pro():
 print ("os.pid is ", os.getpid())
if __name__ == '__main__':
 print ("parent ", os.getpid())
 while True:
  p = mp.Process(target = pro)
  p.start()
  time.sleep(1)

python清理子进程机制剖析

于是我觉得我要重新了解一下这个过程。

销毁僵尸进程的时机

mutilprossing.Process 继承自 BaseProcess 文件在 Lib/mutilprossing/process.py 中,我们看看它的start方法:

_children = set()
class BaseProcess(object):
 def start(self):
  self._check_closed()
  _cleanup()
  self._popen = self._Popen(self)
  self._sentinel = self._popen.sentinel
  # Avoid a refcycle if the target function holds an indirect
  # reference to the process object (see bpo-30775)
  del self._target, self._args, self._kwargs
  _children.add(self)

_children 是一个全局的集合变量,保存着所有 BaseProcess 实例, start 函数末尾处 _children.add(self) 将进程对象放入。又注意到 _cleanup() 函数:

def _cleanup():
 # check for processes which have finished
 for p in list(_children):
  if p._popen.poll() is not None:
   _children.discard(p)

_popen 是一个 Popen 对象,代码在 multiprossing/popen_fork.py 中,其 poll 函数有个 id, sts = os.waitpid(self.pid, flag) 一个回收子进程的函数。回收后再将 BaseProcess 子类实例从_children中移除。

这下就清楚了,python在子进程start中将进程放入集合,子进程可能长时间运行,因此这个集合上的进程会有很多状态,而为了防止过多僵尸进程导致资源占用,python会在下一个子进程 start 时清理僵尸进程。所以,最后一个子进程在自身程序运行完毕后就变成僵尸进程,它在等待下一个子进程start时被清理。所以 ps 上总有一个僵尸进程,但这个僵尸进程的 进程id 一直在变化。

Python 相关文章推荐
基于python3 类的属性、方法、封装、继承实例讲解
Sep 19 Python
Python sorted函数详解(高级篇)
Sep 18 Python
用Python调用win命令行提高工作效率的实例
Aug 14 Python
Django框架HttpResponse对象用法实例分析
Nov 01 Python
基于python判断目录或者文件代码实例
Nov 29 Python
pytorch实现mnist分类的示例讲解
Jan 10 Python
在keras里面实现计算f1-score的代码
Jun 15 Python
一文解决django 2.2与mysql兼容性问题
Jul 15 Python
Python 开发工具通过 agent 代理使用的方法
Sep 27 Python
Python数据可视化常用4大绘图库原理详解
Oct 23 Python
再谈python_tkinter弹出对话框创建
Mar 20 Python
Python编写车票订购系统 Python实现快递收费系统
Aug 14 Python
Python3 加密(hashlib和hmac)模块的实现
Nov 23 #Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
Nov 23 #Python
深入理解Python3 内置函数大全
Nov 23 #Python
Python内置函数delattr的具体用法
Nov 23 #Python
Python 内置函数memoryview(obj)的具体用法
Nov 23 #Python
Python3 操作符重载方法示例
Nov 23 #Python
Python3安装Scrapy的方法步骤
Nov 23 #Python
You might like
咖啡的植物学知识
2021/03/03 咖啡文化
PHP内核探索:变量概述
2014/01/30 PHP
js异或加解密效果代码
2008/06/25 Javascript
解javascript 混淆加密收藏
2009/01/16 Javascript
js 时间格式与时间戳的相互转换示例代码
2013/12/25 Javascript
js实现div闪烁原理及实现代码
2014/06/24 Javascript
escape函数解决js中ajax传递中文出现乱码问题
2014/10/30 Javascript
jQuery简单操作cookie的插件实例
2016/01/13 Javascript
NodeJS的Promise的用法解析
2016/05/05 NodeJs
微信小程序 教程之模板
2016/10/18 Javascript
JavaScript制作弹出层效果
2016/12/02 Javascript
vue.js实现仿原生ios时间选择组件实例代码
2016/12/21 Javascript
easyui 中的datagrid跨页勾选问题的实现方法
2017/01/18 Javascript
基于JavaScript实现窗口拖动效果
2017/01/18 Javascript
使用vs code开发Nodejs程序的使用方法
2017/09/21 NodeJs
JavaScript实现学生在线做题计时器功能
2018/12/05 Javascript
浅谈VueJS SSR 后端绘制内存泄漏的相关解决经验
2018/12/20 Javascript
微信小程序实现点击按钮后修改颜色
2019/12/05 Javascript
JQuery+drag.js上传图片并且实现图片拖曳
2020/11/18 jQuery
使用Python判断IP地址合法性的方法实例
2014/03/13 Python
跟老齐学Python之编写类之四再论继承
2014/10/11 Python
浅谈Python黑帽子取代netcat
2018/02/10 Python
tensorflow: 查看 tensor详细数值方法
2018/06/13 Python
Tensorflow实现酸奶销量预测分析
2019/07/19 Python
pyinstaller还原python代码过程图解
2020/01/08 Python
520使用Python实现“我爱你”表白
2020/05/20 Python
python代数式括号有效性检验示例代码
2020/10/04 Python
Python中常用的os操作汇总
2020/11/05 Python
实例教程 HTML5 Canvas 超炫酷烟花绽放动画实现代码
2014/11/05 HTML / CSS
AmazeUI 点击元素显示全屏的实现
2020/08/25 HTML / CSS
探索欧洲最好的品牌:Bombinate
2019/06/14 全球购物
2016元旦晚会主持词开场白和结束语
2015/12/04 职场文书
《猴王出世》教学反思
2016/02/23 职场文书
优秀范文:《但愿人长久》教学反思3篇
2019/10/24 职场文书
Python基础之变量的相关知识总结
2021/06/23 Python
Java中的Kafka为什么性能这么快及4大核心详析
2022/09/23 Java/Android