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 相关文章推荐
Python实现二分查找算法实例
May 26 Python
Python按行读取文件的简单实现方法
Jun 22 Python
wxpython中Textctrl回车事件无效的解决方法
Jul 21 Python
windows10系统中安装python3.x+scrapy教程
Nov 08 Python
Python实现字符串反转的常用方法分析【4种方法】
Sep 30 Python
python pandas 对series和dataframe的重置索引reindex方法
Jun 07 Python
详解numpy矩阵的创建与数据类型
Oct 18 Python
tensorflow 限制显存大小的实现
Feb 03 Python
python爬取网易云音乐热歌榜实例代码
Aug 07 Python
Python 读取位于包中的数据文件
Aug 07 Python
Django中使用Celery的方法步骤
Dec 07 Python
Django模型层实现多表关系创建和多表操作
Jul 21 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
Optimizer与Debugger兼容性问题的解决方法
2008/12/01 PHP
yii2使用ajax返回json的实现方法
2016/05/14 PHP
PHP搭建大文件切割分块上传功能示例
2017/01/04 PHP
Windows下php+mysql5.7配置教程
2017/05/16 PHP
在Laravel5中正确设置文件权限的方法
2019/05/22 PHP
javascript网页关键字高亮代码
2008/07/30 Javascript
让IE6支持min-width和max-width的方法
2010/06/25 Javascript
jquery nth-child()选择器的简单应用
2010/07/10 Javascript
asp.net中System.Timers.Timer的使用方法
2013/03/20 Javascript
javaScript 动态访问JSon元素示例代码
2013/08/30 Javascript
JavaScript字符串对象substring方法入门实例(用于截取字符串)
2014/10/17 Javascript
jQuery实现带滑动条的菜单效果代码
2015/08/26 Javascript
nodejs搭建本地服务器轻松解决跨域问题
2018/03/21 NodeJs
解决axios发送post请求返回400状态码的问题
2018/08/11 Javascript
Vue列表渲染的示例代码
2018/11/01 Javascript
详解基于Wepy开发小程序插件(推荐)
2019/08/01 Javascript
vue的滚动条插件实现代码
2019/09/07 Javascript
把项目从Python2.x移植到Python3.x的经验总结
2015/04/20 Python
Python中字典(dict)合并的四种方法总结
2017/08/10 Python
使用pygame模块编写贪吃蛇的实例讲解
2018/02/05 Python
Python应用库大全总结
2018/05/30 Python
Python3中详解fabfile的编写
2018/06/24 Python
解决Python 使用h5py加载文件,看不到keys()的问题
2019/02/08 Python
在pytorch中实现只让指定变量向后传播梯度
2020/02/29 Python
Python3读取和写入excel表格数据的示例代码
2020/06/09 Python
python的help函数如何使用
2020/06/11 Python
Python类class参数self原理解析
2020/11/19 Python
css实例教程 一款纯css3实现的超炫动画背画特效
2014/11/05 HTML / CSS
HTML5之SVG 2D入门9—蒙板及mask元素介绍与应用
2013/01/30 HTML / CSS
canvas实现高阶贝塞尔曲线(N阶贝塞尔曲线生成器)
2018/01/10 HTML / CSS
美国祛痘、抗衰老药妆品牌:Murad
2016/08/27 全球购物
《白鹅》教学反思
2014/04/13 职场文书
小学班级特色活动方案
2014/08/31 职场文书
意外伤害赔偿协议书范文
2014/09/23 职场文书
先进教师个人事迹材料
2014/12/15 职场文书
Golang中interface{}转为数组的操作
2021/04/30 Golang