多线程类似于同时执行多个不同程序,多线程运行有如下优点:

  1. 使用线程可以把占据长时间的程序中的任务放到后台去处理。
  2. 用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。
  3. 程序的运行速度可能加快。
  4. 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。

 

问题提出:
在使用多线程的过程中,常常需要考虑一个问题:如何避免子线程无限死循环,主线程早就运行完毕结束自己的生命周期了,而子线程仍然在那死扛,导致退不出程序,就会形成传说中的孤儿进程。
 

解决方案:
如何避免这种情况,Python标准库threading模块中的thread类提供了setDaemon(),它就用来建立守护线程,比如在启动线程前设置thread.setDaemon(True),就是设置该线程为守护线程,就是要告诉进程:该线程是不重要的,进程退出时不需要等待这个线程执行完成。(就是告诉系统:这不是嫡子,这是庶子,不重要)事实上主线程在结束后,守护线程并没有被杀死。当守护线程在最后一个非守护线程完成之后才完成时,控制台不会显示其信息,但若是先于最后一个非守护线程完成的守护线程(但完成时间晚于主线程),其完成信息仍会在控制台显示。由此可见,主线程完成后并没有杀死守护线程,而是对其完成信息不再关心。
thread.setDaemon()设置为True:则主线程执行完毕后会将子线程回收掉,设置为false:主进程执行结束时不会回收子线程
setDaemon() : 设置此线程是否被主线程守护回收。默认False不回收,需要在 start 方法前调用;
设为True相当于像主线程中注册守护,主线程结束时会将其一并回收。