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 测试实现方法
Dec 24 Python
Python 判断是否为质数或素数的实例
Oct 30 Python
基于pandas数据样本行列选取的方法
Apr 20 Python
完美解决在oj中Python的循环输入问题
Jun 25 Python
实例讲解Python脚本成为Windows中运行的exe文件
Jan 24 Python
用python打印菱形的实操方法和代码
Jun 25 Python
Django2 连接MySQL及model测试实例分析
Dec 10 Python
Python接口测试get请求过程详解
Feb 28 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
Jun 12 Python
python zip()函数的使用示例
Sep 23 Python
Python实现日志实时监测的示例详解
Apr 06 Python
Python如何加载模型并查看网络
Jul 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
几个学习PHP的网址
2006/11/25 PHP
WIN8.1下搭建PHP5.6环境
2015/04/29 PHP
php基于session实现数据库交互的类实例
2015/08/03 PHP
ThinkPHP表单数据智能写入create方法实例分析
2015/09/27 PHP
js 小数取整的函数
2010/05/10 Javascript
javascrip客户端验证文件大小及文件类型并重置上传
2011/01/12 Javascript
JS.getTextContent(element,preformatted)使用介绍
2013/09/21 Javascript
js设置cookie过期当前时间减去一秒相当于立即过期
2014/09/04 Javascript
总结JavaScript中布尔操作符||与&&的使用技巧
2015/11/17 Javascript
javascript跑马灯抽奖实例讲解
2020/04/17 Javascript
JS中使用DOM来控制HTML元素
2016/07/31 Javascript
jQuery过滤选择器经典应用
2016/08/18 Javascript
总结Javascript中数组各种去重的方法
2016/10/04 Javascript
jquery+html仿翻页相册功能
2016/12/20 Javascript
vue脚手架vue-cli的学习使用教程
2017/06/06 Javascript
浅谈vue2 单页面如何设置网页title
2017/11/08 Javascript
AngularJS 多指令Scope问题的解决
2018/10/25 Javascript
inquirer.js一个用户与命令行交互的工具详解
2019/05/18 Javascript
js实现固定区域内的不重叠随机圆
2019/10/24 Javascript
vue 修改 data 数据问题并实时显示操作
2020/09/07 Javascript
浅谈python新手中常见的疑惑及解答
2016/06/14 Python
numpy.transpose对三维数组的转置方法
2018/04/17 Python
使用Python监控文件内容变化代码实例
2018/06/04 Python
python判断所输入的任意一个正整数是否为素数的两种方法
2019/06/27 Python
关于Python中的向量相加和numpy中的向量相加效率对比
2019/08/26 Python
Django之模板层的实现代码
2019/09/09 Python
python实现指定ip端口扫描方式
2019/12/17 Python
什么是Python中的匿名函数
2020/06/02 Python
解决keras模型保存h5文件提示无此目录问题
2020/07/01 Python
《小草和大树》教学反思
2014/02/16 职场文书
开展党的群众路线教育实践活动个人对照检查材料
2014/11/05 职场文书
终止劳动合同证明书样本
2014/11/19 职场文书
订货会邀请函
2015/01/31 职场文书
掌握这项技巧,一年阅读300本书不是梦
2019/09/12 职场文书
python保存大型 .mat 数据文件报错超出 IO 限制的操作
2021/05/10 Python
利用Java设置Word文本框中的文字旋转方向的实现方法
2021/06/28 Java/Android