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 正则表达式操作指南
May 04 Python
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
Aug 16 Python
详解Golang 与python中的字符串反转
Jul 21 Python
Php多进程实现代码
May 07 Python
分享vim python缩进等一些配置
Jul 02 Python
python遍历小写英文字母的方法
Jan 02 Python
对django layer弹窗组件的使用详解
Aug 31 Python
pandas实现DataFrame显示最大行列,不省略显示实例
Dec 26 Python
vscode写python时的代码错误提醒和自动格式化的方法
May 07 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
Aug 26 Python
Python从MySQL数据库中面抽取试题,生成试卷
Jan 14 Python
Python装饰器的练习题
Nov 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
用libTemplate实现静态网页的生成
2006/10/09 PHP
PHP验证码类代码( 最新修改,完全定制化! )
2010/12/02 PHP
计算php页面运行时间的函数介绍
2013/07/01 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
2017/07/03 PHP
PHP简单实现正则匹配省市区的方法
2018/04/13 PHP
javascript实现TreeView 无刷新展开的实例代码
2013/07/13 Javascript
jquery中prop()方法和attr()方法的区别浅析
2013/09/06 Javascript
jquery ajax post提交数据乱码
2013/11/05 Javascript
js简单的表格添加行和删除行操作示例
2014/03/31 Javascript
JavaScript中的数组特性介绍
2014/12/30 Javascript
跟我学习javascript的闭包
2015/11/16 Javascript
郁闷!ionic中获取ng-model绑定的值为undefined如何解决
2016/08/27 Javascript
jQuery实现点击下拉框中的值累加到文本框中的方法示例
2017/10/28 jQuery
Vue 路由 过渡动效 数据获取方法
2018/07/31 Javascript
JSON基本语法及与JavaScript的异同实例分析
2019/01/04 Javascript
小程序使用wxs解决wxml保留2位小数问题
2019/12/13 Javascript
原生js实现无缝轮播图效果
2021/01/28 Javascript
python实现rest请求api示例
2014/04/22 Python
Python中解析JSON并同时进行自定义编码处理实例
2015/02/08 Python
Phantomjs抓取渲染JS后的网页(Python代码)
2016/05/13 Python
详解Python打包分发工具setuptools
2019/08/05 Python
python同步windows和linux文件
2019/08/29 Python
基于Python词云分析政府工作报告关键词
2020/06/02 Python
基于python代码批量处理图片resize
2020/06/04 Python
Python工程师必考的6个经典面试题
2020/06/28 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
2021/01/15 Python
html5使用canvas画一条线
2014/12/15 HTML / CSS
国外平面设计第一市场:99designs
2016/10/25 全球购物
英国度假别墅预订:Sykes Cottages
2017/06/12 全球购物
老师自我鉴定范文
2013/12/25 职场文书
工程质量承诺书
2014/03/27 职场文书
社区居务公开实施方案
2014/03/27 职场文书
商务英语专业求职信
2014/06/26 职场文书
领导班子三严三实心得体会
2014/10/13 职场文书
司法局群众路线教育实践活动整改措施思想汇报
2014/10/13 职场文书
详解MongoDB排序时内存大小限制与创建索引的注意事项
2022/05/06 MongoDB