# 没有守护线程时,主线程会等待子线程的结束,子线程结束后,主线程才会结束
# import time
# from threading import Thread
#
#
# def func1():
#     print(666)
#     time.sleep(10)
#
# def func2():
#     pass
#
# if __name__ == '__main__':
#     t = Thread(target=func1)
#     t.start()
# 将子线程设置为守护线程,主线程结束则守护线程结束
# import time
# from threading import Thread
#
#
# def func1():
#     print(666)
#     time.sleep(10)
#
# def func2():
#     pass
#
# if __name__ == '__main__':
#     t = Thread(target=func1)
#     t.daemon = True # 设置子线程为守护线程,设置后,主线程结束了守护线程随之结束
#     t.start()
# 当有主线程、子线程、守护线程时,主线程结束了,守护线程会等待到子线程结束才结束。也就是说,守护线程必须等待到主线程与子线程代码执行结束守护线程才会结束,结束后整体进程结束完毕
    # 不同于进程,守护进程时,当主进程执行结束后,守护进程一定结束
import time
from threading import Thread
def func1():
    while True:
        print('*'* 10)
        time.sleep(1)
def func2():
    print('in func2')
    time.sleep(5)
if __name__ == '__main__':
    t = Thread(target=func1)
    t.daemon = True # 设置子线程为守护线程,设置后,主线程结束了守护线程随之结束
    t.start()
    t2 = Thread(target=func2)
    t2.start()
    t2.join()    # 阻塞等待子线程结束
    print('主线程')
# 主进程在执行完自己的代码执行结束后(守护进程在此时就被回收),然后主进程会一直等非守护的进程都运行完毕后回收进程的资源(否则会产生僵尸进程),之后主进程才会真正的结束
# 主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时被回收),因为主线程的结束意味着进程的结束,进程整体资源都将被回收,而进程必须保证非守护线程都运行完毕后才能结束。