python清理子进程机制剖析

 更新时间:2017年11月23日 14:30:11   作者:栖迟於一丘  
python的机制会自动清理已经完成任务的子进程的,下面通过本文给大家分享python清理子进程机制剖析,需要的朋友参考下吧

起步

在我的印象中,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)

于是我觉得我要重新了解一下这个过程。

销毁僵尸进程的时机

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绘制心形曲线完整代码实现

    这篇文章主要介绍了Python绘制心形曲线的相关资料,通过numpy和matplotlib库计算坐标并绘图,代码包含导入库、定义函数、生成参数、计算坐标、绘图和显示图形等步骤,展示了数学与编程的结合美感,需要的朋友可以参考下
    2024-10-10
  • 详解Python的Django框架中的中间件

    详解Python的Django框架中的中间件

    这篇文章主要介绍了详解Python的Django框架中的中间件,包括中间件的安装等内容,需要的朋友可以参考下
    2015-07-07
  • Python selenium 实例之通过 selenium 查询禅道是否有任务或者BUG

    Python selenium 实例之通过 selenium 查询禅道是否有任务或者BUG

    这篇文章主要介绍了Python selenium 实例之通过 selenium 查询禅道是否有任务或者BUG的相关资料,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Python将图片转换为字符画的方法

    Python将图片转换为字符画的方法

    这篇文章主要为大家详细介绍了Python将图片转换为字符画的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • python常用时间库time、datetime与时间格式之间的转换教程

    python常用时间库time、datetime与时间格式之间的转换教程

    Python项目中很多时候会需要将时间在Datetime格式和TimeStamp格式之间转化,下面这篇文章主要给大家介绍了关于python常用时间库time、datetime与时间格式之间转换的相关资料,需要的朋友可以参考下
    2023-02-02
  • python清除函数占用的内存方法

    python清除函数占用的内存方法

    今天小编就为大家分享一篇python清除函数占用的内存方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • python SQLAlchemy的Mapping与Declarative详解

    python SQLAlchemy的Mapping与Declarative详解

    这篇文章主要介绍了python SQLAlchemy的Mapping与Declarative详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • python语音识别的转换方法

    python语音识别的转换方法

    语音识别技术,也被称为自动语音识别,目标是以电脑自动将人类的语音内容转换为相应的文字。应用包括语音拨号、语音导航、室内设备控制、语音文档检索、简单的听写数据录入等。本文给大家介绍python语音识别的方法,感兴趣的朋友一起看看吧
    2021-10-10
  • python内置数据类型使用方法和继承关系

    python内置数据类型使用方法和继承关系

    这篇文章主要介绍了python内置数据类型使用方法和继承关系,介绍内容有python包含的内置序列、使用内置的数据类型等相关资料,需要的小伙伴可以参考一下
    2022-03-03
  • python免杀技术shellcode的加载与执行

    python免杀技术shellcode的加载与执行

    本文主要介绍了python免杀技术shellcode的加载与执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04

最新评论