Python 的守护线程
Python 的守护线程
- Python 的守护线程
Python 的守护线程
通常在一个应用程序中,主程序隐式地等待所有线程执行完毕。然而,有时候,我们需要在后台运行一些线程,不阻止主程序结束运行。这种线程叫作守护线程(daemon thread)。只要主程序(包含非守护线程)在运行,守护线程就会一直处于活动状态。一旦非守护线程退出,就可以终止守护线程。
在某些情况下,如果一个线程在执行过程中死亡而不会丢失或损坏任何数据,那么使用守护线程就很受欢迎。
一个线程可以用下面的两种方法之一,被声明为守护线程:
- 在创建
Thread
对象时,在构造函数中,把daemon
属性设置为True
; - 把已创建的
Thread
对象的daemon
属性设直为True
。
如果一个线程被设置为守护线程,我们在启动它后,就可以把它忘了。在调用它的程序退出后,守护线程会被自动终止。
下面的代码同时演示了守护线程和非守护线程。
from threading import Thread, current_thread
from time import sleep
def daemon_func():
sleep(3)
print("{}: 来自于守护线程的问候。".format(current_thread().name))
def non_daemon_func():
sleep(1)
print("{}: 来自于非守护线程的问候。".format(current_thread().name))
#创建线程
t1 = Thread(target=daemon_func, name="守护线程", daemon=True)
t2 = Thread(target=non_daemon_func, name = "非守护线程")
#启动线程
t1.start()
t2.start()
print("主线程退出。")
上面代码的输出结果是:
主线程退出。
非守护线程: 来自于非守护线程的问候。
由于我们没有在主线程中使用 join
方法,所以主线程首先退出,接下来是非守护线程退出。但是我们没有看到守护线程输出消息。这是因为守护线程在非守护线程结束的同一时间,就被终止了。如果我们把非守护线程的等待时间从 1
秒改为 5
秒,那么输出结果就会是下面这样子:
主线程退出。
守护线程: 来自于守护线程的问候。
非守护线程: 来自于非守护线程的问候。
<完>