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中使用第三方库xlutils来追加写入Excel文件示例
Apr 05 Python
pygame学习笔记(5):游戏精灵
Apr 15 Python
详解Python中contextlib上下文管理模块的用法
Jun 28 Python
python数据类型_元组、字典常用操作方法(介绍)
May 30 Python
django模板语法学习之include示例详解
Dec 17 Python
Flask框架重定向,错误显示,Responses响应及Sessions会话操作示例
Aug 01 Python
TensorFlow实现打印每一层的输出
Jan 21 Python
Python中的xlrd模块使用原理解析
May 21 Python
解决在keras中使用model.save()函数保存模型失败的问题
May 21 Python
python opencv实现简易画图板
Aug 27 Python
PyCharm上安装Package的实现(以pandas为例)
Sep 18 Python
python RSA加密的示例
Dec 09 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
php 正则表达式小结
2009/08/31 PHP
PHP输出时间差函数代码
2013/01/28 PHP
PHP之sprintf函数用法详解
2014/11/12 PHP
JavaScript实现滚动栏效果的方法
2015/04/27 PHP
php序列化函数serialize() 和 unserialize() 与原生函数对比
2015/05/08 PHP
JS中图片缓冲loading技术的实例代码
2013/08/29 Javascript
jQuery实现等比例缩放大图片让大图片自适应页面布局
2013/10/16 Javascript
JavaScript中扩展Array contains方法实例
2020/08/23 Javascript
JavaScript实现将数组中所有元素连接成一个字符串的方法
2015/04/06 Javascript
jQuery实现的多级下拉菜单效果代码
2015/08/24 Javascript
js实现iframe框架取值的方法(兼容IE,firefox,chrome等)
2015/11/26 Javascript
基于JS如何实现类似QQ好友头像hover时显示资料卡的效果(推荐)
2016/06/09 Javascript
微信小程序 购物车简单实例
2016/10/24 Javascript
json的结构与遍历方法实例分析
2017/04/25 Javascript
详解vue express启动数据服务
2017/07/05 Javascript
vue中的$emit 与$on父子组件与兄弟组件的之间通信方式
2018/05/13 Javascript
JavaScript函数式编程(Functional Programming)声明式与命令式实例分析
2019/05/21 Javascript
js prototype和__proto__的关系是什么
2019/08/23 Javascript
解决LayUI加上form.render()下拉框和单选以及复选框不出来的问题
2019/09/27 Javascript
在vue中使用防抖和节流,防止重复点击或重复上拉加载实例
2019/11/13 Javascript
vue+Element-ui前端实现分页效果
2020/11/15 Javascript
[01:11:08]Winstrike vs NB 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
Python爬取京东的商品分类与链接
2016/08/26 Python
Python assert关键字原理及实例解析
2019/12/13 Python
Flask中sqlalchemy模块的实例用法
2020/08/02 Python
巴西本土电商平台:Americanas
2020/06/21 全球购物
资料员的岗位职责
2013/11/20 职场文书
法学研究生自我鉴定范文
2013/12/04 职场文书
会计电算化专业毕业生推荐信
2013/12/24 职场文书
班级旅游计划书
2014/05/03 职场文书
《司马光》教学反思
2016/02/22 职场文书
go类型转换及与C的类型转换方式
2021/05/05 Golang
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
2021/07/01 MySQL
python调用ffmpeg命令行工具便捷操作视频示例实现过程
2021/11/01 Python
webpack介绍使用配置教程详解webpack介绍和使用
2022/06/25 Javascript
oracle delete误删除表数据后如何恢复
2022/06/28 Oracle