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

线程与委托:类结合多线程时current_thread返回一致问题

问题原因与解决办法

嘿,我来帮你捋清楚为啥你看到的总是同一个线程!

核心问题出在你调用threading.current_thread()的时机上:

  • 你在FirstClass的__init__方法里打印线程信息,但__init__是在创建这个线程对象的父线程(绝大多数情况是主线程)里执行的,根本没跑到你新创建的子线程里面去!
  • 只有当你调用线程对象的start()方法后,Python才会真正启动一个全新的子线程,然后执行run()方法里的逻辑——这部分代码才是跑在新线程上下文里的。

修正后的示例代码

import threading
import time

class FirstClass(threading.Thread):
    def __init__(self, obj):
        super().__init__()  # 用super调用父类构造,比直接写threading.Thread.__init__更规范
        self.obj = obj
        # 这里打印的是创建线程的父线程(比如主线程)
        print(f"在__init__里跑的线程: {threading.current_thread()}")

    def compute(self):
        # 这个方法如果在run里调用,就会跑到子线程里啦
        print(f"在compute里跑的线程: {threading.current_thread()}")
        time.sleep(1)  # 模拟点耗时操作

    def run(self):
        # run方法是子线程的入口!这里的代码才会在新线程里执行
        self.compute()

# 来测试看看效果
if __name__ == "__main__":
    print(f"主线程: {threading.current_thread()}")
    thread1 = FirstClass("测试对象1")
    thread2 = FirstClass("测试对象2")
    
    thread1.start()
    thread2.start()
    
    thread1.join()
    thread2.join()

结果说明

运行这段代码你就能看到区别了:

  • __init__里的打印全是主线程
  • compute里的打印会是两个不同的子线程(比如Thread-1、Thread-2)

要是你想用委托的方式(比如把要执行的逻辑作为参数传进来),也很简单——只要把委托的调用放在run方法里,那它自然就会在子线程中运行啦。

内容的提问来源于stack exchange,提问作者Evangelos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:45:54