线程的daemon属性
01.主线程是进程第一个启动的线程,也是必须要启动的线程。
- 如果线程A启动了一个线程B,则A为B的父进程,B为A的子线程。
- 创建子线程时可以对子线程设置daemon值,daemon值的作用如下:
- daemon值为False,父线程结束时会检测子线程是否结束,如果子线程还在运行,则主线程等待子线程完成后退出。
- daemon值为False的线程称为non-daemon线程。
- 主线程的daemon值默认为False,如果要修改,必须在调用start()方法前修改。
- 子线程的daemon值默认继承父线程的daemon值。
- daemon值为True,父线程结束时,所有daemon值为True的子线程一同退出,不管是否完成。
- 在有多个子线程,并且包含daemon值为False的子线程的情况下,主线程会等所有daemon值为False的子线程完成后退出。
- daemon值为True的线程称为daemon线程。
- daemon值为False,父线程结束时会检测子线程是否结束,如果子线程还在运行,则主线程等待子线程完成后退出。
- daemon线程的示例:
import threading
import time
def display1():
for i in range(10):
time.sleep(1)
print("this is thread {}, my thread id is {}".format(threading.current_thread().name, threading.current_thread().ident))
print("this is the {}/10 times".format(i+1))
def display2():
for i in range(10):
time.sleep(1.9)
print("this is thread {}, my thread id is {}".format(threading.current_thread().name, threading.current_thread().ident))
print("this is the {}/10 times".format(i+1))
if __name__ == "__main__":
t1 = threading.Thread(name='thread_one', target=display1, daemon=True)
t2 = threading.Thread(name='thread_two', target=display2, daemon=False)
t1.start()
t2.start()
time.sleep(10)
print("===== i am main thread, now i closed! =====")
02.threading.Thread实例与daemon属性相关的属性和方法包括:
- isDaemon(),判断当前线层是否为daemon线程。
- setDaemon(),设置当前线程为daemon线程,必须在start()方法之前设置,比如:
import threading
import time
def display():
for i in range(10):
time.sleep(1)
print("this is thread {}, my thread id is {}".format(threading.current_thread().name, threading.current_thread().ident))
if __name__ == "__main__":
t1 = threading.Thread(name='thread_one', target=display, daemon=False)
print(t1.isDaemon())
t1.setDaemon(True)
t1.start()
print(t1.isDaemon())
time.sleep(10)
print("===== i am main thread, now i closed! =====")
03.Daemon线程的应用场景:
- 后台任务,如发送心跳包及监控。
- 主线程工作才有用的线程,例如主线程维护公共资源,主线程退出则子线程也无意义。
- 随时可以被终止的线程。
文档更新时间: 2021-10-04 00:19 作者:闻骏