python清理子进程机制剖析

作者:栖迟於一丘 时间:2021-08-10 22:05:19 

起步

在我的印象中,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 一直在变化。

来源:http://www.hongweipeng.com/index.php/archives/1375/?utm_source=tuicool&utm_medium=referral

标签:python,子进程
0
投稿

猜你喜欢

  • 解决django FileFIELD的编码问题

    2023-07-01 04:28:42
  • python 文件和路径操作函数小结

    2023-02-11 18:11:36
  • Ubuntu16.04 server下配置MySQL,并开启远程连接的方法

    2024-01-17 08:59:10
  • 如何对Oracle8数据库进行维护?

    2009-11-20 18:01:00
  • django框架用户权限中的session缓存到redis中的方法

    2021-10-13 01:09:48
  • django序列化时使用外键的真实值操作

    2022-07-19 10:09:30
  • Python 注解方式实现缓存数据详解

    2023-07-15 22:11:22
  • python实现图片转字符画

    2021-02-13 22:58:33
  • ASP利用 xmlhttp 分块上传文件

    2007-11-01 22:55:00
  • 浏览器是怎样工作的二:渲染引擎 HTML解析

    2012-05-09 20:34:20
  • Python的10道简单测试题(含答案)

    2021-12-28 03:57:24
  • 实例讲解MySQL 慢查询

    2024-01-20 16:25:56
  • Python中修改字符串的四种方法

    2021-08-05 20:40:23
  • 一文带你了解Python枚举类enum的使用

    2022-05-27 07:46:51
  • 深入理解TCP协议与UDP协议的原理及区别

    2022-11-06 21:30:31
  • 详解Python的Django框架中的Cookie相关处理

    2022-07-05 00:13:53
  • mysql 一次向表中插入多条数据实例讲解

    2024-01-14 06:34:48
  • python实现学生信息管理系统(面向对象)

    2022-06-13 16:16:07
  • vue $mount 和 el的区别说明

    2024-04-28 09:20:24
  • python中ThreadPoolExecutor线程池和ProcessPoolExecutor进程池

    2022-08-28 08:26:45
  • asp之家 网络编程 m.aspxhome.com