一、守护进程
1.1、什么是守护进程?
1、守护进程会在主进程代码运行结束的情况下,立即挂掉。
2、守护进程本身就是一个子进程。
3、主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束,
1.2、为什么要用守护进程?
1、守护进程本身就是一个子进程,所以在主进程需要将任务并发执行的时候需要开启子进程。
2、当该子进程执行的任务生命周期伴随着主进程的生命周期时,就需要将该子进程做成守护进程。
1.3、如何使用守护进程?
1.例子:
from multiprocessing import Process
import os
import time
def task(x):
print('%s is running ' %x)
time.sleep(3)
print('%s is done' %x)
if __name__ == '__main__':
p1=Process(target=task,args=('守护进程',))
p2=Process(target=task,args=('子进程',))
p1.daemon=True # 设置p1为守护进程
p1.start()
p2.start()
print('主')
>>:主
>>:子进程 is running
>>:子进程 is done
这里可看出,当主进程的代码运行完毕后,守护进程就会立马结束掉。而不会去管其他子进程是否运行完毕。
二、守护线程
2.1、什么是守护线程?
1、守护线程会在"该进程内所有非守护线程全部都运行完毕后,守护线程才会挂掉"。并不是主线程运行完毕后守护线程挂掉。这一点是和守护进程的区别之处!
2、守护线程守护的是:当前进程内所有的子线程!
3、主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收)。因为主线程的结束意味着进程的结束,进程整体的资源都将被回收,而进程必须保证非守护线程都运行完毕后才能结束。
2.2、主线程与进程的关系
1、主线程的生命周期就是一个进程的生命周期
2、主进程等待子进程是因为主进程要负责回收子进程的系统资源,主线程等待子线程是因为主线程要等待子线程运行完毕(子线程运行完毕后,这个进程才算运行完毕)后,主线程才结束。
2.3、如何使用守护线程?
1.例子:当只有一个子线程并且为守护线程,那么这个守护线程就会等待主线程运行完毕后挂掉
from threading import Thread
import os
import time
def task(x):
print('%s is running ' %x)
time.sleep(3)
print('%s is done' %x)
if __name__ == '__main__':
t1=Thread(target=task,args=('守护线程',))
t1.daemon=True # 设置p1为守护进程
t1.start()
print('主')
>>:守护线程 is running
>>:主
2.例子:当有多个子线程时,守护线程就会等待所有的子线程运行完毕后,守护线程才会挂掉(这一点和主线程是一样的,都是等待所有的子线程运行完毕后才会挂掉)。
from threading import Thread
import time
def foo():
print(123)
time.sleep(1)
print("end123")
def bar():
print(456)
time.sleep(3)
print("end456")
t1=Thread(target=foo)
t2=Thread(target=bar)
t1.daemon=True
t1.start()
t2.start()
print("main-------")
>>:123
>>:456
>>:main-------
>>:end123
>>:end456