【一】僵尸进程
- 想象一下,有一个家庭里,父母(父进程)安排孩子(子进程)去完成一个特定的任务,比如买东西。孩子出门去了,父母继续做他们的事情。当孩子完成任务后,他们会回家并告诉父母他们已经完成了任务。在这个过程中,父母需要知道孩子是否已经回来并完成了任务。如果孩子回来了,但父母没有注意到(也就是没有“接收”孩子的完成状态),孩子就像一个“僵尸”一样在家里徘徊,不是真正自由去做其他事情,也不是完全结束他们的任务。
- 在计算机术语中,这个“僵尸”就是所谓的僵尸进程。当一个子进程完成它的工作后(比如完成一个计算或任务),它会发送一个信号给它的父进程(比如操作系统),告诉父进程它已经完成了工作。如果父进程没有正确地处理这个信号(也就是没有“接收”子进程的完成状态),那么子进程虽然已经完成了它的工作,但它的一些信息(比如它的进程号和退出状态)仍然存储在系统中。这就是僵尸进程。它们不再执行任何任务,但仍占用系统资源。
- 僵尸进程通常不会占用很多资源,但如果有很多僵尸进程累积,它们可能会耗尽系统用于追踪进程的资源。因此,通常需要父进程在子进程完成后及时处理(也就是“接收”子进程的状态),以避免产生僵尸进程。
【二】孤儿进程
- 孤儿进程可以用一个简单的家庭故事来比喻。想象一下,有一个孩子(子进程)正在做家庭作业,而他的父母(父进程)在家里照看着他。但是,如果父母突然不在了(比如父进程意外结束或崩溃),孩子就会变成一个“孤儿”。
- 在计算机术语中,这就是所谓的孤儿进程。当一个子进程正在运行,但其父进程已经结束或崩溃时,这个子进程就变成了孤儿进程。不过,和现实生活中的孤儿不同,计算机系统中的孤儿进程会被“收养”。这意味着操作系统的一个特殊进程(通常是称为init的进程,在一些系统中可能是其他名称)会成为这个孤儿进程的新父进程。init进程会负责这个孤儿进程,处理它的任何输出,并在孤儿进程结束时收集它的退出状态。
- 所以,在计算机系统中,孤儿进程并不是一个大问题,因为它们会被操作系统自动处理。它们不会像僵尸进程那样占用资源不释放。实际上,孤儿进程的存在通常是短暂的,因为它们在完成任务后会被init进程适当地清理。
【三】守护进程
- 守护进程可以用一个家庭里的看家机器人来比喻。想象一下,你有一个机器人,它的工作是全天候看护你的家,处理一些后台任务,比如监控安全系统、自动调节温度、定时浇水等。这个机器人默默地在背后工作,不需要你的直接干预,同时它的工作也不会干扰到你的日常生活。
- 在计算机术语中,守护进程就像这样一个机器人。它是一个在后台运行的特殊进程,执行一些长期运行的服务任务。通常,守护进程不直接与用户交互,而是在后台默默地工作。它们负责很多重要的系统任务,比如日志记录、系统监控、任务调度等。
- 代码示例
# 没有设置守护进程
from multiprocessing import Process
import time
def func(name):
print(f'{name}还活着')
time.sleep(2)
print(f'{name}正常死亡')
if __name__ == '__main__':
p = Process(target=func, args=('苏妲己',))
p.start()
print('纣王死了')
'''
纣王死了
苏妲己还活着
苏妲己正常死亡
'''
# 当主进程死亡之后,子进程还是会进行
# 加上守护进程
from multiprocessing import Process
import time
def func(name):
print(f'{name}还活着')
time.sleep(2)
print(f'{name}正常死亡')
if __name__ == '__main__':
p = Process(target=func, args=('苏妲己',))
p.daemon = True
p.start()
print('纣王死了')
# 纣王死了
# 主进程死亡,子进程就不会存在了
标签:__,僵尸,print,孤儿,进程,守护,name
From: https://www.cnblogs.com/Hqqqq/p/17971131