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实现动态添加类的属性或成员函数的解决方法
Jul 16 Python
Python urllib、urllib2、httplib抓取网页代码实例
May 09 Python
Python中的index()方法使用教程
May 18 Python
python数据处理 根据颜色对图片进行分类的方法
Dec 08 Python
Python3多线程基础知识点
Feb 19 Python
对Python函数设计规范详解
Jul 19 Python
超简单的Python HTTP服务
Jul 22 Python
正则给header的冒号两边参数添加单引号(Python请求用)
Aug 09 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
Apr 23 Python
django创建超级用户时指定添加其它字段方式
May 14 Python
使用OpenCV实现道路车辆计数的使用方法
Jul 15 Python
python3实现无权最短路径的方法
May 12 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
用php+mysql一个名片库程序
2006/10/09 PHP
php HandlerSocket的使用
2011/05/02 PHP
windows下配置apache+php+mysql时出现问题的处理方法
2014/06/20 PHP
php分页查询mysql结果的base64处理方法示例
2017/05/18 PHP
克隆javascript对象的三个方法小结
2011/01/12 Javascript
javascript 保存文件到本地实现方法
2012/11/29 Javascript
JavaScript代码复用模式详解
2014/11/07 Javascript
BootStrap智能表单实战系列(七)验证的支持
2016/06/13 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
2016/11/30 Javascript
Vue2.0如何发布项目实战
2017/07/27 Javascript
解决vuejs 使用value in list 循环遍历数组出现警告的问题
2018/09/26 Javascript
jquery.param()实现数组或对象的序列化方法
2018/10/08 jQuery
浅谈JavaScript中this的指向更改
2020/07/28 Javascript
JavaScript实现简易计算器小功能
2020/10/22 Javascript
学习python之编写简单简单连接数据库并执行查询操作
2016/02/27 Python
使用python遍历指定城市的一周气温
2017/03/31 Python
R vs. Python 数据分析中谁与争锋?
2017/10/18 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
2018/07/04 Python
Python生成一个迭代器的实操方法
2019/06/18 Python
python3.8下载及安装步骤详解
2020/01/15 Python
Python 实现打印单词的菱形字符图案
2020/04/12 Python
东南亚地区最大的购物网站Lazada新加坡站点:Lazada.sg
2016/07/17 全球购物
Champion官网:美国冠军运动服装
2017/01/25 全球购物
美国最灵活的移动提供商:Tello
2017/07/18 全球购物
Chantelle仙黛尔内衣美国官网:法国第一品牌内衣
2018/07/26 全球购物
小米乌克兰网上商店:Xiaomi.UA
2019/10/29 全球购物
Myprotein西班牙官网:欧洲第一大运动营养品牌
2020/02/24 全球购物
班级年度安全计划书
2014/05/01 职场文书
社区工作者演讲稿
2014/05/23 职场文书
地下停车场租赁协议范本
2014/10/07 职场文书
2015年政治教研组工作总结
2015/07/22 职场文书
谢师宴学生致辞
2015/07/27 职场文书
新郎父母婚礼答谢词
2015/09/29 职场文书
《天使的翅膀》读后感3篇
2019/12/20 职场文书
浅谈MySQL之浅入深出页原理
2021/06/23 MySQL
Debian11 Xfce终端光标的颜色怎么设置?
2022/08/14 数码科技