关于守护进程和守护线程的区别
一、守护进程
1.1、什么是守护进程?
1、守护进程会在主进程代码运行结束的情况下,立即挂掉。
2、守护进程本身就是一个子进程。
3、主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束,
1.2、为什么要用守护进程?
1、守护进程本身就是一个子进程,所以在主进程需要将任务并发执行的时候需要开启子进程。
2、当该子进程执行的任务生命周期伴随着主进程的生命周期时,就需要将该子进程做成守护进程。
二、守护线程
2.1、什么是守护线程?
1、
守护线程会在"该进程内所有非守护线程全部都运行完毕后,守护线程才会挂掉"。并不是主线程运行完毕后守护线程挂掉。这一点是和守护进程的区别之处!
2、守护线程守护的是:当前进程内所有的非守护线程!你可以算上主线程理解,也可以不算上理解,因为主线程和守护线程是一起死的。
3、主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收)这里的运行完毕就是线程死掉了,回收了。因为主线程的结束意味着进程的结束,进程整体的资源都将被回收,而进程必须保证非守护线程都运行完毕后才能结束。守护线程有一个特征,那就是会和主线程一起死掉。
2.2、主线程与进程的关系
1、主线程的生命周期就是一个进程的生命周期
2、主进程等待子进程是因为主进程要负责回收子进程的系统资源,主线程等待子线程是因为主线程要等待子线程运行完毕(子线程运行完毕后,这个进程才算运行完毕)后,主线程才结束。
举一个例子
import threading
import time
def _wait():
time.sleep(1000)
# FlagA
start = time.time()
# 第二个参数 deamon为是否设置为守护线程。如果这里设置为非守护线程,也就是一个子线程,整个代码就是主线程,他会等这个子线程完事儿了之后才运行完毕,也就是1000s之后,这就是一个正常的进程的运行周期,等所有子线程结束,然后主线程结束,整个进程就结束了。如果把他设置为守护线程,那么无论你设置为多少秒,都会很快结束,因为主线程不会等守护线程,只要所有非守护线程结束了,主线程就结束了,然后守护线程就结束了。
t = threading.Thread(target=_wait, daemon=False)
t.start()
# t.join()
stop = time.time()
print(stop-start)
关于stoped状态的主线程是不是死了,在网上看到一个大佬的回答
线程在进入Stopped状态后, 就会被销毁, 是不可能再次Start的.要再次Start只能重新建立一个. 这个上面很多人也已经说过了.
但没有人解释为什么线程池中线程却可以重复利用,如果线程池中线程也是执行完任务后进入Stopped状态, 下次再新建并Start的话,很显然那就不叫线程池了.
所以, 线程池中的线程在执行完任务后,并没有进入Stopped状态,实际上线程池线程实际上是利用类似WaitHandle.WaitOne 方法在指定句柄上等待,直到有新任务到来.执行完后就再次等待. 基于你的重复利用线程的要求, 及你目前程度. 推荐你使用.NET的线程池, 自己实现线程池,要做的好的话..也是要花些功夫的..........