You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:54:55