python3 守护进程daemon

 什么是守护进程?

import time
from multiprocessing import Process


def func(name):
    while 1:
        time.sleep(0.5)
        print(f"我是{name}")


if __name__ == '__main__':
    p1 = Process(target=func, args=("进程1",))
    p1.daemon = True  # 必须写在子进程启动前,主进程守护子进程,主进程结束,子进程直接结束
    p1.start()
    time.sleep(2)
    print("主进程执行结束。")

执行结果:

我是进程1
我是进程1
我是进程1
主进程执行结束。

主进程守护子进程,主进程结束,子进程直接结束

关于守护进程需要强调两点:

其一:守护进程会在主进程代码执行结束后就终止

其二:守护进程内无法再开启子进程,否则抛出异常

守护进程必须在开启子进程前开启

from multiprocessing import Process
import time


def task(name):
    print("%s is running" % name)
    time.sleep(3)
    print("%s is done" % name)


if __name__ == '__main__':
    t = Process(target=task, args=("子进程1",))
    # 守护进程必须在开启子进程前开启
    t.daemon = True
    t.start()
    time.sleep(1)
    print("")

执行结果:

子进程1 is running
主

在主进程代码执行完毕,只要出现打印主进程信息,p1就不会执行或者死掉

from multiprocessing import Process
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()
    print("main------")

执行结果:

main------
456
end456

接着看下面的程序

from multiprocessing import Process
import time


def foo(name):
    print("%s 开始" % name)
    time.sleep(1)
    print("%s end123" % name)


if __name__ == '__main__':
    p1 = Process(target=foo, args=("进程1",))
    p2 = Process(target=foo, args=("进程2",))
    p3 = Process(target=foo, args=("进程3",))

    p1.daemon = True
    p1.start()
    p2.start()
    p3.start()
    print("main------")

执行结果:

main------
进程3 开始
进程2 开始
进程3 end123
进程2 end123

 

再看最后一个程序

import time
from multiprocessing import Process


def func(name, sec):
    print(name, 123)
    time.sleep(sec)
    print(name, "123end")


if __name__ == '__main__':
    p1 = Process(target=func, args=("进程1", 1))
    p2 = Process(target=func, args=("进程2", 2))
    p3 = Process(target=func, args=("进程3", 3))
    p1.daemon = True  # 必须在start()之前设置守护进程
    p1.start()
    p2.start()
    p3.start()
    time.sleep(0.5)
    print("主进程结束,主进程还得等待其他子进程(非守护进程)结束才行")

 执行结果:

进程1 123
进程3 123
进程2 123
主进程结束,主进程还得等待其他子进程(非守护进程)结束才行
进程2 123end
进程3 123end
原文地址:https://www.cnblogs.com/lilyxiaoyy/p/10967275.html