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 09 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
Apr 11 Python
Python使用正则表达式实现文本替换的方法
Apr 18 Python
微信跳一跳辅助python代码实现
Jan 05 Python
分析Python中解析构建数据知识
Jan 20 Python
浅谈python正则的常用方法 覆盖范围70%以上
Mar 14 Python
Python元组知识点总结
Feb 18 Python
Django使用redis缓存服务器的实现代码示例
Apr 28 Python
Django框架静态文件处理、中间件、上传文件操作实例详解
Feb 29 Python
python爬虫实例之获取动漫截图
May 31 Python
Python实现网络聊天室的示例代码(支持多人聊天与私聊)
Jan 27 Python
python3实现Dijkstra算法最短路径的实现
May 12 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
改变Apache端口等配置修改方法
2008/06/05 PHP
UCenter中的一个可逆加密函数authcode函数代码
2010/07/20 PHP
PHP应用JSON技巧讲解
2013/02/03 PHP
利用curl 多线程 模拟 并发的详解
2013/06/14 PHP
javascript String 对象
2008/04/25 Javascript
JavaScript 判断浏览器是否支持SVG的代码
2013/03/21 Javascript
js 获取屏幕各种宽高的方法(浏览器兼容)
2013/05/15 Javascript
给ListBox添加双击事件示例代码
2013/12/02 Javascript
javascript读取xml实现javascript分页
2013/12/13 Javascript
javascript怎么禁用浏览器后退按钮
2014/03/27 Javascript
js实现图片漂浮效果的方法
2015/03/02 Javascript
Bootstrap布局之栅格系统详解
2016/06/13 Javascript
微信小程序 时间格式化(util.formatTime(new Date))详解
2016/11/16 Javascript
angularjs 实现带查找筛选功能的select下拉框实例
2017/01/11 Javascript
微信小程序 生命周期和页面的生命周期详细介绍
2017/01/19 Javascript
js实现从左向右滑动式轮播图效果
2017/07/07 Javascript
OpenLayers实现图层切换控件
2020/09/25 Javascript
elementUI同一页面展示多个Dialog的实现
2020/11/19 Javascript
Tensorflow的可视化工具Tensorboard的初步使用详解
2018/02/11 Python
python微信跳一跳系列之色块轮廓定位棋盘
2018/02/26 Python
PyQt5每天必学之滑块控件QSlider
2018/04/20 Python
对pandas replace函数的使用方法小结
2018/05/18 Python
详解Python中的format格式化函数的使用方法
2019/11/20 Python
Python实现http接口自动化测试的示例代码
2020/10/09 Python
viagogo法国票务平台:演唱会、体育比赛、戏剧门票
2017/03/27 全球购物
Vans(范斯)德国官网:美国南加州的原创极限运动潮牌
2017/05/02 全球购物
智乐游戏测试笔试题
2014/05/21 面试题
歌唱比赛获奖感言
2014/01/21 职场文书
2014年五四青年节活动方案
2014/03/29 职场文书
客户经理竞聘演讲稿
2014/05/15 职场文书
五好文明家庭事迹材料
2014/12/20 职场文书
鸟的天堂导游词
2015/01/31 职场文书
宣传委员竞选稿
2015/11/19 职场文书
2016年庆祝六一儿童节活动总结
2016/04/06 职场文书
Mysql中存储引擎的区别及比较
2021/06/04 MySQL
MySQL学习之基础操作总结
2022/03/19 MySQL