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 相关文章推荐
pycharm 使用心得(五)断点调试
Jun 06 Python
Python实现基于权重的随机数2种方法
Apr 28 Python
Python制作豆瓣图片的爬虫
Dec 28 Python
python实现搜索文本文件内容脚本
Jun 22 Python
利用pyecharts实现地图可视化的例子
Aug 12 Python
Python学习笔记之列表推导式实例分析
Aug 13 Python
pytorch 在sequential中使用view来reshape的例子
Aug 20 Python
python groupby 函数 as_index详解
Dec 16 Python
PyCharm无法引用自身项目解决方式
Feb 12 Python
如何使用Python抓取网页tag操作
Feb 14 Python
python 实现IP子网计算
Feb 18 Python
利用Python+OpenCV三步去除水印
May 28 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
Smarty结合Ajax实现无刷新留言本实例
2007/01/02 PHP
PHP使用星号隐藏用户名,手机和邮箱的实现方法
2016/09/22 PHP
PHP simplexml_import_dom()函数讲解
2019/02/03 PHP
对laravel的session获取与存取方法详解
2019/10/08 PHP
理解Javascript_08_函数对象
2010/10/15 Javascript
jquery入门—数据删除与隔行变色以及图片预览
2013/01/07 Javascript
用js格式化金额可设置保留的小数位数
2014/05/09 Javascript
javascript使用Promise对象实现异步编程
2016/03/01 Javascript
JS克隆,属性,数组,对象,函数实例分析
2016/11/26 Javascript
原生JS获取元素集合的子元素宽度实例
2016/12/14 Javascript
js实现日历的简单算法
2017/01/24 Javascript
Angularjs验证用户输入的字符串是否为日期时间
2017/06/01 Javascript
JS动态修改网页body的背景色实例代码
2017/10/07 Javascript
webpack写jquery插件的环境配置
2017/12/21 jQuery
layer.close()关闭进度条和Iframe窗的方法
2018/08/17 Javascript
js实现图片推拉门效果代码实例
2019/05/18 Javascript
解决在layer.open中使用时间控件laydate失败的问题
2019/09/11 Javascript
Python实现高效求解素数代码实例
2015/06/30 Python
python中list列表的高级函数
2016/05/17 Python
python编程线性回归代码示例
2017/12/07 Python
火车票抢票python代码公开揭秘!
2018/03/08 Python
python如何解析配置文件并应用到项目中
2019/06/27 Python
python实现各种插值法(数值分析)
2019/07/30 Python
pytorch 图像预处理之减去均值,除以方差的实例
2020/01/02 Python
利用Vscode进行Python开发环境配置的步骤
2020/06/22 Python
使用CSS3制作响应式导航菜单的方法
2015/07/12 HTML / CSS
详解canvas多边形(蜘蛛图)的画法示例
2018/01/29 HTML / CSS
美国豪华时尚女性精品店:Kirna Zabête
2018/01/11 全球购物
梅西百货官网:Macy’s
2020/08/04 全球购物
岗位竞聘书范文
2014/03/31 职场文书
退休教师欢送会主持词
2014/03/31 职场文书
通信工程专业求职信
2014/06/04 职场文书
离婚协议书范文2014(夫妻感情破裂)
2014/12/14 职场文书
街道党风廉政建设调研报告
2015/01/01 职场文书
MySQL图形化管理工具Navicat安装步骤
2021/12/04 MySQL
python blinker 信号库
2022/05/04 Python