IsanaYashiro 2020-03-01
# linux(mac)环境下才强调的两个概念,windows下没有. 基于unix环境(linux,macOS) 为什么会产生僵尸进程?? 主进程需要等待子进程结束之后,主进程才结束 主进程时刻监测子进程的运行状态,当子进程结束之后,一段时间之内,将子进程进行回收. 为什么主进程不在子进程结束后马上对其回收呢? 主进程与子进程是异步关系.主进程无法马上捕获子进程什么时候结束. 如果子进程结束之后马上再内存中释放资源,主进程就没有办法监测子进程的状态了. unix针对于上面的问题,提供了一个机制. 所有的子进程结束之后,立马会释放掉文件的操作链接,内存的大部分数据,但是会保留一些内容: 进程号,结束时间,运行状态,等待主进程监测,回收.
父进程由于某种原因结束了,但是你的子进程还在运行中,这样你的这些子进程就成了孤儿进程.你的父进程如果结束了,你的所有的孤儿进程就会被init进程的回收,init就变成了你的父进程,对你进行回收.
僵尸进程: 所有的子进程结束之后,在被主进程回收之前,都会进入僵尸进程状态 #僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源 僵尸进程有无危害??? 如果父进程不对僵尸进程进行回收(wait/waitpid),产生大量的僵尸进程,这样就会占用内存,占用进程pid号. 僵尸进程如何解决??? 父进程产生了大量子进程,但是不回收,这样就会形成大量的僵尸进程,解决方式就是直接杀死父进程,将所有的僵尸进程变成孤儿进程进程,由init进行回收.
守护进程不可以有子进程 否则抛异常 被守护进程运行完成 同时守护进程 同时完结 不管守护进程还有没有执行完 守护进程先完结就没有守护的意义 # p.daemon = True # 将p子进程设置成守护进程,守护主进程,只要主进程结束,子进程无论执行与否,都马上结束.一定要在发起前 # 必须在发起前守护 多用于窗口化 下面验证了守护进程运行完就完了 对被守护的没影响
实列
from multiprocessing import Process def task(): print('a') if __name__ == '__main__': p=Process(target=task,args=(())) p.daemon=True p.start() p.join() print('11111111111111111111111') print(p.is_alive()) print('主')