Python类属性存储的线程被覆盖后会终止吗?原因是什么?
关于Python线程被类属性覆盖后的执行问题
首先贴出你提供的代码:
#!/usr/bin/python3 import threading, time class Threader(): def __init__(self): self.var = 1 def create_threads(self): self.mythread=threading.Thread(target=self.do_things, daemon=True) self.mythread.start() def do_things(self): time.sleep(0.5) self.var=self.var+1 mobject = Threader() mobject.create_threads() mobject.create_threads() mobject.create_threads() time.sleep(3) print(mobject.var)
核心结论
覆盖类实例的mythread属性不会导致已启动的线程提前终止,你看到所有线程完成自增是完全正常的结果。
原因分析
- Python的线程对象一旦调用
start()方法启动,就会交给操作系统的线程调度器独立管理,和持有该线程对象引用的变量(比如这里的self.mythread)没有绑定关系。 - 每次调用
create_threads()时,只是把self.mythread这个变量的指向改成了新的线程对象,但之前启动的旧线程对象只要还在执行,操作系统就会继续让它运行,直到do_things函数执行完毕。 - 变量引用被覆盖,只是意味着你没法再通过
self.mythread访问旧的线程对象了,但旧线程本身的生命周期不受这个引用的影响——只要线程的任务没完成,且进程还在运行(这里主线程sleep了3秒,足够所有子线程执行完),它就会继续运行。
补充说明
你之前的假设错误在于混淆了线程对象的引用和线程本身的执行:线程对象是Python层面的封装,而实际执行的线程是操作系统级别的实体,一旦启动就脱离了Python变量引用的控制,除非主动让主线程等待子线程完成(比如调用join())、进程退出,否则会一直执行到任务结束。
内容的提问来源于stack exchange,提问作者Marco Montevechi Filho
相关产品推荐
相关产品推荐

