线程的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线程的示例:
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   作者:闻骏