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 相关文章推荐
web.py在SAE中的Session问题解决方法(使用mysql存储)
Jun 24 Python
python条件变量之生产者与消费者操作实例分析
Mar 22 Python
python实现求解列表中元素的排列和组合问题
Mar 15 Python
Python3.5基础之函数的定义与使用实例详解【参数、作用域、递归、重载等】
Apr 26 Python
python networkx 根据图的权重画图实现
Jul 10 Python
Pycharm远程调试原理及具体配置详解
Aug 08 Python
python 统计文件中的字符串数目示例
Dec 24 Python
关于ResNeXt网络的pytorch实现
Jan 14 Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
Feb 21 Python
详解python内置模块urllib
Sep 09 Python
Pytorch中Softmax和LogSoftmax的使用详解
Jun 05 Python
python如何利用cv2.rectangle()绘制矩形框
Dec 24 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
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
2015/12/31 PHP
js下将字符串当函数执行的方法
2011/07/13 Javascript
在图片上显示左右箭头类似翻页的代码
2013/03/04 Javascript
javascript dom追加内容实现示例
2013/09/21 Javascript
JavaScript日期时间格式化函数分享
2014/05/05 Javascript
javascript检测浏览器的缩放状态实现代码
2014/09/28 Javascript
js实现jquery的offset()方法实例
2015/01/10 Javascript
js实现同一页面多个不同运动效果的方法
2015/04/10 Javascript
jquery实现标签上移、下移、置顶
2015/04/26 Javascript
jQuery实现自动滚动到页面顶端的方法
2015/05/22 Javascript
基于JS实现checkbox全选功能实例代码
2016/10/31 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
微信小程序实现弹出菜单功能
2018/06/12 Javascript
JavaScript数据结构之栈实例用法
2019/01/18 Javascript
详解mpvue开发微信小程序基础知识
2019/09/23 Javascript
vue实现评价星星功能
2020/06/30 Javascript
谈谈JavaScript中的垃圾回收机制
2020/09/17 Javascript
详解python开发环境搭建
2016/12/16 Python
Python基于回溯法子集树模板解决全排列问题示例
2017/09/07 Python
python 打印直角三角形,等边三角形,菱形,正方形的代码
2017/11/21 Python
对numpy数据写入文件的方法讲解
2018/07/09 Python
python3 unicode列表转换为中文的实例
2018/10/26 Python
Python流程控制 while循环实现解析
2019/09/02 Python
python中树与树的表示知识点总结
2019/09/14 Python
Tensorflow 模型转换 .pb convert to .lite实例
2020/02/12 Python
Pycharm安装并配置jupyter notebook的实现
2020/05/18 Python
使用python matploblib库绘制准确率,损失率折线图
2020/06/16 Python
详解Anaconda 的安装教程
2020/09/23 Python
websocket+sockjs+stompjs详解及实例代码
2018/11/30 HTML / CSS
马来西亚在线购物市场:PGMall.my
2019/10/13 全球购物
教育实习生的自我评价分享
2013/11/21 职场文书
校园餐饮创业计划书
2014/01/10 职场文书
创业者迈进成功第一步:如何写创业计划书?
2014/03/22 职场文书
客户答谢会致辞
2015/07/30 职场文书
解决Django transaction进行事务管理踩过的坑
2021/04/24 Python
SQL bool盲注和时间盲注详解
2022/07/23 SQL Server