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使用百度API上传文件到百度网盘代码分享
Nov 08 Python
探究Python的Tornado框架对子域名和泛域名的支持
May 02 Python
python判断图片宽度和高度后删除图片的方法
May 22 Python
利用Python实现Windows定时关机功能
Mar 21 Python
Python基于正则表达式实现检查文件内容的方法【文件检索】
Aug 30 Python
Django url,从一个页面调到另个页面的方法
Aug 21 Python
python实现多进程按序号批量修改文件名的方法示例
Dec 30 Python
django queryset相加和筛选教程
May 18 Python
python中tab键是什么意思
Jun 18 Python
python ssh 执行shell命令的示例
Sep 29 Python
python两种获取剪贴板内容的方法
Nov 06 Python
Python3.10的一些新特性原理分析
Sep 15 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简单浏览目录内容的实现代码
2013/06/07 PHP
Yii2实现ajax上传图片插件用法
2016/04/28 PHP
php使用socket调用http和smtp协议实例小结
2019/07/26 PHP
JScript中的undefined和"undefined"的区别
2007/03/08 Javascript
js 遍历json返回的map内容示例代码
2013/10/29 Javascript
Javascript前端UI框架Kit使用指南之kitjs事件管理
2014/11/28 Javascript
JavaScript中的getTimezoneOffset()方法使用详解
2015/06/10 Javascript
jQuery实现导航高亮的方法【附demo源码下载】
2016/11/09 Javascript
BootStrap 下拉菜单点击之后不会出现下拉菜单(下拉菜单不弹出)的解决方案
2016/12/14 Javascript
详解JavaScript时间处理之几个月前或几个月后的指定日期
2016/12/21 Javascript
JS查找数组中重复元素的方法详解
2017/06/14 Javascript
js CSS3实现卡牌旋转切换效果
2017/07/04 Javascript
jQuery绑定事件方法及区别(bind,click,on,live,one)
2017/08/14 jQuery
jQuery简单实现的HTML页面文本框模糊匹配查询功能完整示例
2018/05/09 jQuery
解决ng-repeat产生的ng-model中取不到值的问题
2018/10/02 Javascript
Node.js 获取微信JS-SDK CONFIG的方法示例
2019/05/21 Javascript
跟老齐学Python之私有函数和专有方法
2014/10/24 Python
python 信息同时输出到控制台与文件的实例讲解
2018/05/11 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
2018/05/25 Python
python判断输入日期为第几天的实例
2018/11/13 Python
flask实现验证码并验证功能
2019/12/05 Python
python扫描线填充算法详解
2020/02/19 Python
200行python代码实现贪吃蛇游戏
2020/04/24 Python
Django视图、传参和forms验证操作
2020/07/15 Python
adidas瑞典官方网站:购买阿迪达斯鞋子和运动服
2019/12/11 全球购物
岗位标兵事迹材料
2014/05/17 职场文书
预备党员群众路线教育实践活动思想汇报2014
2014/10/25 职场文书
工作表扬信
2015/01/17 职场文书
区域销售经理岗位职责
2015/04/02 职场文书
2015秋季开学演讲稿范文
2015/07/16 职场文书
运动会闭幕式通讯稿
2015/07/18 职场文书
学习十八大的感悟
2015/08/11 职场文书
教师节作文之小学四年级
2019/09/03 职场文书
Oracle更换为MySQL遇到的问题及解决
2021/05/21 Oracle
Docker容器harbor私有仓库部署和管理
2022/08/05 Servers