【4.2】守护进程
【一】什么是守护进程
- 守护进程 (daemon) 是在计算机系统启动时就已经运行,并且一直在后台运行的一类特殊进程。
- 它们通常不与用户直接交互,也不接受标准输入和输出,而是在后台执行某种任务或提供某种服务。
- 守护进程往往是由系统管理员手动启动的,它们可以在系统启动时自动启动,一直运行在后台,直到系统关闭或被停止。
- 常见的守护进程包括网络服务 (如 web 服务器、邮件服务器、 ftp 服务器等)、日志记录系统 (如系统日志服务、应用程序日志服务等) 等。
- 守护进程通常在后台运行,不需要用户交互,并且有较高的权限,因此编写守护进程需要特别注意安全性和稳定性。
【二】主进程死亡,子进程未死亡
from multiprocessing import Process
import time
def task(name):
print(f'总管:>>{name}>>正常存活')
time.sleep(2)
print(f'总管:>>{name}>>正常死亡')
if __name__ == '__main__':
print(f'皇帝 :>>> ChiMeng >>> 执掌江山')
p = Process(target=task, args=('dream',))
# p = Process(target=task, kwargs={"name":"dream"})
p.start()
print(f'皇帝 :>>> ChiMeng >>> 寿终正寝')
# 皇帝 :>>> ChiMeng >>> 执掌江山
# 皇帝 :>>> ChiMeng >>> 寿终正寝
# 总管:>>dream>>正常存活
# 总管:>>dream>>正常死亡
【三】主进程死亡,子进程必死亡
【1】正确用法
- 将设置主进程的方法在 调用主进程 的前面声明
from multiprocessing import Process
import time
def task(name):
print(f'总管:>>{name}>>正常存活')
time.sleep(2)
print(f'总管:>>{name}>>正常死亡')
if __name__ == '__main__':
print(f'皇帝 :>>> ChiMeng >>> 执掌江山')
p = Process(target=task, args=('dream',))
# p = Process(target=task, kwargs={"name":"dream"})
# 将进程 p 设置成守护进程
p.daemon = True
p.start()
print(f'皇帝 :>>> ChiMeng >>> 寿终正寝')
# 皇帝 :>>> ChiMeng >>> 执掌江山
# 皇帝 :>>> ChiMeng >>> 寿终正寝
【2】错误用法
- 进程已经开始,但是在开始后给进程加锁
from multiprocessing import Process
import time
def task(name):
print(f'总管:>>{name}>>正常存活')
time.sleep(2)
print(f'总管:>>{name}>>正常死亡')
if __name__ == '__main__':
print(f'皇帝 :>>> ChiMeng >>> 执掌江山')
p = Process(target=task, args=('dream',))
# p = Process(target=task, kwargs={"name":"dream"})
p.start()
# 将进程 p 设置成守护进程
p.daemon = True
print(f'皇帝 :>>> ChiMeng >>> 寿终正寝')
# assert self._popen is None, 'process has already started'
# AssertionError: process has already started
# 报错原因:进程已经开始了无法再次重置进程状态
# 总管:>>dream>>正常存活
# 总管:>>dream>>正常死亡
【四】小练习
# 主进程代码运行完毕,守护进程就会结束
from multiprocessing import Process
from threading import Thread
import time
def foo():
print(123)
time.sleep(1)
print("end123")
def bar():
print(456)
time.sleep(3)
print("end456")
if __name__ == '__main__':
p1 = Process(target=foo)
p2 = Process(target=bar)
p1.daemon = True
p1.start()
p2.start()
# 打印该行则主进程代码结束,则守护进程p1应该被终止,可能会有p1任务执行的打印信息123
# 因为主进程打印main----时,p1也执行了,但是随即被终止
print("main-------")
# main-------
# 456
# end456
本文来自博客园,作者:Chimengmeng,转载请注明原文链接:https://www.cnblogs.com/dream-ze/p/17982367