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 相关文章推荐
Saltstack快速入门简单汇总
Mar 01 Python
win系统下为Python3.5安装flask-mongoengine 库
Dec 20 Python
Python使用struct处理二进制的实例详解
Sep 11 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
Aug 31 Python
Python面向对象程序设计类的多态用法详解
Apr 12 Python
PyQt5响应回车事件的方法
Jun 25 Python
将python安装信息加入注册表的示例
Nov 20 Python
Python使用QQ邮箱发送邮件报错smtplib.SMTPAuthenticationError
Dec 20 Python
Python实现搜索算法的实例代码
Jan 02 Python
django使用F方法更新一个对象多个对象字段的实现
Mar 28 Python
python 实现的截屏工具
May 08 Python
PyTorch device与cuda.device用法
Apr 03 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/01 无线电
3种平台下安装php4经验点滴
2006/10/09 PHP
浅析application/x-www-form-urlencoded和multipart/form-data的区别
2014/06/22 PHP
php实现用于验证所有类型的信用卡类
2015/03/24 PHP
php+ajax登录跳转登录实现思路
2016/07/31 PHP
Laravel5.1 框架控制器基础用法实例分析
2020/01/04 PHP
js Flash插入函数免激活代码
2009/03/31 Javascript
jQuery对象和DOM对象相互转化
2009/04/24 Javascript
通过JS获取用户本地图片路径并显示的代码
2012/02/16 Javascript
使用JavaScript链式编程实现模拟Jquery函数
2014/12/21 Javascript
jQuery中:gt选择器用法实例
2014/12/29 Javascript
js实现图片上传并正常显示
2015/12/19 Javascript
详解使用Vue.Js结合Jquery Ajax加载数据的两种方式
2017/01/10 Javascript
BootStrap CSS全局样式和表格样式源码解析
2017/01/20 Javascript
jQuery插件jquery.kxbdmarquee.js实现无缝滚动效果
2017/02/15 Javascript
elementUI 动态生成几行几列的方法示例
2019/07/11 Javascript
vue 集成 vis-network 实现网络拓扑图的方法
2019/08/07 Javascript
小程序的上传文件接口的注意要点解析
2019/09/17 Javascript
uni-app如何页面传参数的几种方法总结
2020/04/28 Javascript
[02:17]2016完美“圣”典风云人物:Sccc专访
2016/12/03 DOTA
[11:44]Ti9 OG夺冠时刻
2019/08/25 DOTA
python翻译软件实现代码(使用google api完成)
2013/11/26 Python
Python生成器(Generator)详解
2015/04/13 Python
Django模板变量如何传递给外部js调用的方法小结
2017/07/24 Python
python中字符串变二维数组的实例讲解
2018/04/03 Python
Python使用分布式锁的代码演示示例
2018/07/30 Python
python 输出所有大小写字母的方法
2019/01/02 Python
Python字符串逆序输出的实例讲解
2019/02/16 Python
python matplotlib库绘制散点图例题解析
2019/08/10 Python
Django def clean()函数对表单中的数据进行验证操作
2020/07/09 Python
python实现ping命令小程序
2020/12/28 Python
美国汽车零部件和配件网站:CarParts
2019/03/13 全球购物
汽车销售求职自荐信
2013/10/01 职场文书
基层工作经历证明
2015/06/19 职场文书
MySQL 8.0 之不可见列的基本操作
2021/05/20 MySQL
Python list列表删除元素的4种方法
2021/11/01 Python