什么是守护进程?
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