线程结束守护线程
一、守护线程
无论是进程还是线程,都遵循:守护xx会等待主xx运行完毕后被销毁。需要强调的是:运行完毕并非终止运行。
- 对主进程来说,运行完毕指的是主进程代码运行完毕
- 对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕
二、详细解释
- 主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束。
- 主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收)。因为主线程的结束意味着进程的结束,进程整体的资源都将被回收,而进程必须保证非守护线程都运行完毕后才能结束。
三、代码实例
from threading import Thread
import time
def task(name):
print(f"{name}线程开始")
time.sleep(3)
print(f'{name}线程结束')
t = Thread(target=task, args=('t',))
t2 = Thread(target=task, args=('t2',))
#必须在t.start()之前设置
t.daemon = True # 对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕
t2.start()
t.start()
print('主')
print(t.is_alive())
t2线程开始
t线程开始
主
True
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
四、总结
- 在主进程中的守护进程是主进程结束之后,守护的子进程就会结束
- 而在主线程中的守护线程,即使主进程运行结束了,守护的子线程还不会结束,只有等所有非守护线程运行完毕之后才会结束