如何将Thread子类创建的线程设为daemon线程随程序结束自动终止
为继承threading.Thread的自定义类设置daemon守护线程的方法
核心原理
Python线程的daemon属性为True时,该线程为守护线程。Python进程退出时,会自动终止所有守护线程,不会等待守护线程执行完成;默认创建的线程daemon属性为False(非守护线程),进程会等待所有非守护线程执行完毕才会退出,这就是示例中子线程死循环导致主程序结束后进程无法退出的原因。
设置方式
注意:daemon属性必须在线程调用start()方法启动前设置,启动后修改属性不生效,共有两种合法配置方式:
- 方式1:在自定义线程类的
__init__初始化方法中配置,既可以调用父类构造方法时传入daemon=True参数,也可以在初始化逻辑中设置self.daemon = True - 方式2:实例化线程对象后,调用
start()前,手动设置实例的daemon属性为True
修改后的完整示例代码
import threading import time class A_Class(threading.Thread): def __init__(self): threading.Thread.__init__(self, daemon=True) # 也可以不通过父类参数传值,单独写 self.daemon = True 实现相同效果 def __del__(self): print('deleted') def run(self): while True: print("running") time.sleep(1) a_obj = A_Class() # 若不在类内部设置,也可以在此处添加 a_obj.daemon = True 完成配置 a_obj.start() time.sleep(5) print('The time is up, the thread should end')
运行上述代码,主线程执行5秒结束后,守护子线程会被自动终止,不会继续在后台无限循环运行。
内容的提问来源于stack exchange,提问作者gero
相关产品推荐
相关产品推荐

