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实现根据ip地址反向查找主机名称的方法
Apr 29 Python
深入浅析Python字符编码
Nov 12 Python
python中利用xml.dom模块解析xml的方法教程
May 24 Python
Python浅复制中对象生存周期实例分析
Apr 02 Python
Python小工具之消耗系统指定大小内存的方法
Dec 03 Python
梅尔频率倒谱系数(mfcc)及Python实现
Jun 18 Python
python批量处理txt文件的实例代码
Jan 13 Python
Python如何使用OS模块调用cmd
Feb 27 Python
python从Oracle读取数据生成图表
Oct 14 Python
python基于pygame实现飞机大作战小游戏
Nov 19 Python
python利用文件时间批量重命名照片和视频
Feb 09 Python
python playwright之元素定位示例详解
Jul 23 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
destoon安全设置中需要设置可写权限的目录及文件
2014/06/21 PHP
Windows下Apache + PHP SESSION丢失的解决过程全纪录
2015/04/07 PHP
PHP缓冲区用法总结
2016/02/14 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
Aster vs Newbee BO5 第二场2.19
2021/03/10 DOTA
Mootools 1.2教程 Fx.Tween的使用
2009/09/15 Javascript
JS实现自动切换文字的导航效果代码
2015/08/27 Javascript
jQuery实现的可编辑表格完整实例
2016/06/20 Javascript
jquery动态创建div与input的实例代码
2016/10/12 Javascript
Javascript数组中push方法用法分析
2016/10/31 Javascript
layui导航栏实现代码
2017/05/19 Javascript
JavaScript 完成注册页面表单校验的实例
2017/08/19 Javascript
bootstrap table实现点击翻页功能 可记录上下页选中的行
2017/09/28 Javascript
jQuery实现简单的下拉菜单导航功能示例
2017/12/07 jQuery
Angular5集成eventbus的示例代码
2018/07/19 Javascript
JS调用安卓手机摄像头扫描二维码
2018/10/16 Javascript
Python使用urllib2获取网络资源实例讲解
2013/12/02 Python
零基础写python爬虫之神器正则表达式
2014/11/06 Python
python 根据时间来生成唯一的字符串方法
2019/01/14 Python
详解python之heapq模块及排序操作
2019/04/04 Python
python处理document文档保留原样式
2019/09/23 Python
python根据文本生成词云图代码实例
2019/11/15 Python
Python SSL证书验证问题解决方案
2020/01/13 Python
用python发送微信消息
2020/12/21 Python
HTML5 video播放器全屏(fullScreen)方法实例
2015/04/24 HTML / CSS
HTML5 Canvas玩转酷炫大波浪进度图效果实例(附demo)
2016/12/14 HTML / CSS
香蕉共和国Banana Republic官网:美国GAP旗下偏贵族风格服饰品牌
2016/11/21 全球购物
计算 s=(x*y)1/2,用两个宏定义来实现
2016/08/11 面试题
会计职业生涯规划书
2014/01/13 职场文书
买房协议书
2014/04/11 职场文书
广场舞大赛策划方案
2014/05/31 职场文书
秋季运动会演讲稿
2014/09/16 职场文书
2014年汽车销售工作总结
2014/12/01 职场文书
2014年网络管理员工作总结
2014/12/01 职场文书
2015年材料员工作总结
2015/04/30 职场文书
应用最多的公文《通知》如何写?
2019/04/02 职场文书