守护线程
守护子线程
论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁
需要强调的是:运行完毕并非终止运行
主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束。
2 主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收)。因为主线程的结束意味着进程的结束,进程整体的资源都将被回收,而进程必须保证非守护线程都运行完毕后才能结束。
问题:非守护进程与守护进程并存
A和B线程,A_thread = threading.Thread(target=test1, daemon=True) B_thread = threading.Thread(target=test1, daemon=True),当删除B中的daemon = True,结果还是运行了A和B
原因:A是守护子线程,tB非守护子线程,跟主线程使用一块内存,所以会输出A,A子线程的任务代码,由于A.B都有睡眠时间,所以执行主线程代码,然后对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕,所以会执行A、B睡眠后的任务代码,然后程序退出。
我们会问为什么A守护子线程,也会执行sleep后的代码,不是说主线程代码执行完毕,守护线程就被干掉了吗?这里要注意是对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕,当时B还没执行完毕