[TOC]
一、守护线程
无论是进程还是线程,都遵循:守护xx会等待主xx运行完毕后被销毁。需要强调的是:运行完毕并非终止运行。
- 对主进程来说,运行完毕指的是主进程代码运行完毕
- 对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕
1.1 详细解释
- 主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束。
- 主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收)。因为主线程的结束意味着进程的结束,进程整体的资源都将被回收,而进程必须保证非守护线程都运行完毕后才能结束。
1.2 守护进程演示
from threading import Thread,enumerate,currentThread
import time
'''
守护线程:
守护的是进程的运行周期,只要当前进程中一个线程在运行就会守护
'''
def task():
print('守护线程开始')
print(currentThread())
time.sleep(20)
def task2():
print('子线程 start')
time.sleep(5)
print(enumerate()) # 主线程结束了,但是 守护进程并没有死掉
print('子线程 end')
if __name__ == '__main__':
t1 = Thread(target=task)
t2 = Thread(target=task2)
t1.setName("守护线程")
t2.setName("子线程")
t1.daemon = True # 守护线程
t2.start()
t1.start()
print('主')