Python创建Thread线程未调用start方法为何会自动运行?
问题原因分析
核心问题出在你给Thread的target参数传值的写法上:
- 你写的
target=myobj.rn()带了括号,这是直接调用函数的语法,Python会在这一行代码执行时立刻运行rn方法,再把rn的返回值(你这里没有定义返回值,默认是None)赋值给target参数,整个过程和线程是否启动没有任何关系。 - 正确的写法是去掉括号,写
target=myobj.rn,这才是把rn这个函数对象本身传给target,后续你调用线程的start()方法时,才会在线程中执行这个函数。
执行流程拆解
你的代码实际执行顺序是:
- 运行
myobj=myclass():执行类的构造方法,打印Hey there, i am constructor,完成实例化。 - 运行
Thread(target=myobj.rn()):- 第一步先计算参数值:执行
myobj.rn(),打印okk,得到返回值None - 第二步把
target参数设为None,完成线程实例的创建
- 第一步先计算参数值:执行
- 此时即便调用
mythread.start()也不会有任何输出,因为target为None,没有可执行的目标函数。
修正后的代码示例
from threading import Thread class myclass: def __init__(self): print("Hey there, i am constructor") def rn(self): print("okk") myobj=myclass() # 去掉rn后的括号,只传函数对象 mythread=Thread(target=myobj.rn) # 此时调用start才会执行rn方法打印okk mythread.start()
内容的提问来源于stack exchange,提问作者SIDDHARTH SINGH
相关产品推荐
相关产品推荐

