线程与委托:类结合多线程时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
相关产品推荐
相关产品推荐

