孤儿进程 : 当父进程先于子进程退出,此时子进程就会成为孤儿进程。
- 孤儿进程会被系统指定进程收养,即系统进程会成为孤儿进程新的父进程。系统进程会自动处理孤儿进程退出状态
僵尸进程 : 子进程先于父进程退出,父进程没有处理子进程的退出状态,此时子进程就会成为僵尸进程 - 僵尸进程会滞留部分PCB信息在内存中,大量的僵尸进程会消耗系统的内存资源,所以要尽量避免僵尸进程产生
如何避免僵尸进程产生 - 父进程先退出
- 父进程处理子进程退出状态
pid,status = os.wait()
功能 : 在父进程中阻塞等待处理子进程的退出
返回值:pid 退出的那个子进程的PID号
status 获取子进程的退出状态
os.WEXITSTATUS(status)
功能:获取原来退出状态
pid,status = os.waitpid(pid,option)
功能 : 在父进程中阻塞等待处理子进程的退出
参数 : pid -1 表示等待任意子进程退出
>0 表示等待对应PID号的子进程退出
option 0 表示阻塞等待
WNOHANG 表示非阻塞
返回值:pid 退出的那个子进程的PID号
status 子进程的退出状态
waitpid(-1,0) ===> wait()
创建二级子进程
父进程创建子进程等待子进程退出
子进程创建下一级子进程,然后立即退出
二级子进程成为孤儿,处理具体工作
multiprocessing 模块创建进程
- 需要将要做的事情封装成函数
- 使用multiprocessing提供的类Process创建进程对象
- 通过进程对象和Process初始化进程进行进程的设置,绑定函数
- 启动进程,会自动执行绑定的函数
- 完成进程的回收
创建进程对象
Def fun():
pass
p=multiprocessing.Process(target = fun)
Process()
功能: 创建进程对象
参数: target : 要绑定的函数
name : 给进程起的名称 (默认Process-1)
args: 元组 用来给target函数位置传参
kwargs : 字典 用来给target函数键值传参
p.start()
功能 : 启动进程 自动运行terget绑定函数。此时进程被创建
p.join([timeout])
功能: 阻塞等待子进程退出
参数: 超时时间
- 使用multiprocessing创建进程子进程同样复制父进程的全部内存空间,之后有自己独立的空间,执行上互不干扰
- 子进程也是有自己特有的PID等资源
- 如果不使用join回收可能会产生僵尸进程
- 使用multiprocessing创建子进程,一般父进程功能就是创建子进程回收子进程,所有事件交给子进程完成