一个线程可以被设置为是否 daemen(守护)线程,Thread 的构造函数的 daemon 参数默认是None,默认情况下创建的是非守护线程。
一个程序只有一个主线程,即 Python 程序的初始线程,主线程必须等待这些非守护线程都执行完后才能退出。而守护线程不能阻塞主线程,即主线程不用等待守护线程执行完就可以退出。守护线程主要用于不需要用户交互的后台服务或那些即使突然死掉也不造成数据破坏的线程。
可以在创建线程时设置参数“daemon=True”或创建一个线程后调用 set_daemon(True)方法,将该线程设置为守护线程。例如:
import threading
import time
import logging
logging.basicConfig(level=logging.DEBUG, format='(%(threadName)-9s) %(message)s',)
def non_daemon():
logging.debug('Starting')
logging.debug('Exiting')
def daemon():
logging.debug('Starting')
time.sleep(10)
logging.debug('Exiting')
logging.debug('Starting')
t = threading.Thread(name='Non-daemon Thread', target=non_daemon)
d = threading.Thread(name='Daemon Thread', target=daemon,daemon=True)
#或者 d.setDaemon(True)
d.start()
t.start()
logging.debug('Exiting')
输出如下:
(MainThread) Starting
(Daemon Thread) Starting
(Non-daemon Thread) Starting
(MainThread) Exiting
(Non-daemon Thread) Exiting
运行该程序,当主线程和所有非守护线程退出后,守护线程并没有立即退出,而是等待 10 秒完成自己工作后才退出,即 10 秒后才输出下列信息:
(Daemon Thread) Exiting