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解析html开发库pyquery使用方法
Feb 07 Python
用python结合jieba和wordcloud实现词云效果
Sep 05 Python
python2.7实现FTP文件下载功能
Apr 15 Python
python中subprocess批量执行linux命令
Apr 27 Python
Django中的ajax请求
Oct 19 Python
python读取指定字节长度的文本方法
Aug 27 Python
python实现百度OCR图片识别过程解析
Jan 17 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
Feb 17 Python
Python图像处理库PIL的ImageDraw模块介绍详解
Feb 26 Python
jupyter notebook更换皮肤主题的实现
Jan 07 Python
python程序实现BTC(比特币)挖矿的完整代码
Jan 20 Python
python Protobuf定义消息类型知识点讲解
Mar 02 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数据记录代码
2008/06/07 PHP
PHP内核探索之解释器的执行过程
2015/12/22 PHP
浅谈php中fopen不能创建中文文件名文件的问题
2017/02/06 PHP
PHP中关键字interface和implements详解
2017/06/14 PHP
JavaScript判断文件上传类型的方法
2014/09/02 Javascript
Javascript中使用A标签获取当前目录的绝对路径方法
2015/03/02 Javascript
JS显示表格内指定行html代码的方法
2015/03/31 Javascript
jQuery Validate插件实现表单验证
2016/08/19 Javascript
原生js实现新闻列表展开/收起全文功能
2017/01/20 Javascript
JS实现的自动打字效果示例
2017/03/10 Javascript
在Vue.js中使用Mixins的方法
2017/09/12 Javascript
Vue中的基础过渡动画及实现原理解析
2018/12/04 Javascript
vue实现分页组件
2020/06/16 Javascript
[52:20]DOTA2-DPC中国联赛正赛 SAG vs XGBO3 第一场 3月5日
2021/03/11 DOTA
python数据结构树和二叉树简介
2014/04/29 Python
Python多线程编程(五):死锁的形成
2015/04/05 Python
python使用socket远程连接错误处理方法
2015/04/29 Python
python执行CMD指令,并获取返回的方法
2018/12/19 Python
Python设计模式之适配器模式原理与用法详解
2019/01/15 Python
Python爬虫使用浏览器cookies:browsercookie过程解析
2019/10/22 Python
Pytorch Tensor 输出为txt和mat格式方式
2020/01/03 Python
解决pip install psycopg2出错问题
2020/07/09 Python
10种CSS3实现的loading动画,挑一个走吧?
2020/11/16 HTML / CSS
美国最大的袜子制造商和零售商:Renfro Socks
2017/09/03 全球购物
美国购买汽车零件网站:Buy Auto Parts
2018/04/02 全球购物
Schecker荷兰:狗狗用品和配件
2019/06/06 全球购物
linux面试题参考答案(6)
2014/08/29 面试题
通信工程毕业生自荐信
2013/11/01 职场文书
个人简历自我评价
2014/01/06 职场文书
骨干教师培训制度
2014/01/13 职场文书
办理收楼委托书范本
2014/10/09 职场文书
销售员未完成销售业绩的检讨书
2014/10/12 职场文书
高一军训决心书
2015/02/05 职场文书
幼儿园教师师德表现自我评价
2015/03/05 职场文书
2015年财务经理工作总结
2015/05/13 职场文书
Oracle删除归档日志及添加定时任务
2022/06/28 Oracle