【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
posted @ 2024-01-23 14:23  Chimengmeng  阅读(17)  评论(0编辑  收藏  举报
/* */