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)
于是我觉得我要重新了解一下这个过程。
销毁僵尸进程的时机
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