首页 > Python并发编程
Python daemon守护线程详解
前面不只一次提到,当程序中拥有多个线程时,主线程执行结束并不会影响子线程继续执行。换句话说,只有程序中所有线程全部执行完毕后,程序才算真正结束。
下面程序演示了包含 2 个线程的程序执行流程:
除此之外,Python 还支持创建另一种线程,称为守护线程(或后台线程)。此类线程的特点是,当程序中主线程及所有非守护线程执行结束时,未执行完毕的守护线程也会随之消亡(进行死亡状态),程序将结束运行。
并且需要注意的一点是,线程对象调用 daemon 属性必须在调用 start() 方法之前,否则 Python 解释器将报 RuntimeError 错误。
举个例子,下面程序演示了如何创建一个守护线程:
下面程序演示了包含 2 个线程的程序执行流程:
import threading #主线程执行如下语句 for i in range(5): print(threading.current_thread().getName()) #定义线程要调用的方法,*add可接收多个以非关键字方式传入的参数 def action(*add): for arc in add: #调用 getName() 方法获取当前执行该程序的线程名 print(threading.current_thread().getName() +" "+ arc) #定义为线程方法传入的参数 my_tuple = ("https://www.xinbaoku.com/python/",\ "https://www.xinbaoku.com/shell/",\ "https://www.xinbaoku.com/java/") #创建线程 thread = threading.Thread(target = action,args =my_tuple) #启动线程 thread.start()程序执行结果为:
MainThread
MainThread
MainThread
MainThread
MainThread
Thread-1 https://www.xinbaoku.com/python/
Thread-1 https://www.xinbaoku.com/shell/
Thread-1 https://www.xinbaoku.com/java/
除此之外,Python 还支持创建另一种线程,称为守护线程(或后台线程)。此类线程的特点是,当程序中主线程及所有非守护线程执行结束时,未执行完毕的守护线程也会随之消亡(进行死亡状态),程序将结束运行。
前面章节中,我们学习了 2 种创建线程的方式,守护线程本质也是线程,因此其创建方式和普通线程一样,唯一不同之处在于,将普通线程设为守护线程,需通过线程对象调用其 damon 属性,将该属性的值该为 True。Python 解释器的垃圾回收机制就是守护线程的典型代表,当程序中所有主线程及非守护线程执行完毕后,垃圾回收机制也就没有再继续执行的必要了。
并且需要注意的一点是,线程对象调用 daemon 属性必须在调用 start() 方法之前,否则 Python 解释器将报 RuntimeError 错误。
举个例子,下面程序演示了如何创建一个守护线程:
import threading #定义线程要调用的方法,*add可接收多个以非关键字方式传入的参数 def action(length): for arc in range(length): #调用 getName() 方法获取当前执行该程序的线程名 print(threading.current_thread().getName()+" "+str(arc)) #创建线程 thread = threading.Thread(target = action,args =(20,)) #将thread设置为守护线程 thread.daemon = True #启动线程 thread.start() #主线程执行如下语句 for i in range(5): print(threading.current_thread().getName())程序中第 10 行代码处,通过调用 thread 线程的 daemon 属性并赋值为 True,则该 thread 线程就变成了守护线程。由于该程序中除了 thread 守护线程就只有主线程 MainThread,因此只要主线程执行结束,则守护线程将随之消亡。程序执行结果为:
Thread-1 0
MainThread
MainThread
Thread-1 1
MainThread
Thread-1 2
MainThread
MainThread
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算