Python 线程在调用thread.start之前开始运行

Python 线程在调用thread.start之前开始运行,python,multithreading,python-multithreading,Python,Multithreading,Python Multithreading,self.read无限期运行,因此程序永远不会到达print行。如果不调用t1.start(),这怎么可能呢?(即使我调用它,它也应该开始运行并转到下一行,不是吗?由于target=self.read()上的尾部,您在错误的线程中运行self.read,当前线程(不是您正在创建的新线程)并传递self.read调用的返回值作为线程的目标参数Thread希望传递一个要调用的函数,因此只需删除括号并记住启动线程: t1=threading.Thread(target=self.read()) pri

self.read
无限期运行,因此程序永远不会到达
print
行。如果不调用
t1.start()
,这怎么可能呢?(即使我调用它,它也应该开始运行并转到下一行,不是吗?

由于
target=self.read()
上的尾部
,您在错误的线程中运行
self.read
,当前线程(不是您正在创建的新线程)并传递
self.read
调用的返回值作为
线程的
目标
参数
Thread
希望传递一个要调用的函数,因此只需删除括号并记住启动线程:

t1=threading.Thread(target=self.read())
print("something")
t2=threading.Thread(target=self.runChecks(), args=(self,))
对于需要参数的目标,可以使用
args
kwargs
参数来
threading.Thread
,也可以使用lambda。例如,要在线程中运行
f(a,b,x=c)
,可以使用

t1=threading.Thread(target=self.read)
t1.start()
print("something")


尽管要注意,如果选择lambda,lambda将在使用时查找
f
a
b
c
,而不是在定义
lambda
时,因此如果在调度线程之前重新分配这些变量,可能会得到意外的结果(这可能需要任意长的时间,即使您立即呼叫
启动

您是生命的救世主
thread = threading.Thread(target=f, args=(a, b), kwargs={'x': c})
thread = threading.Thread(target=lambda: f(a, b, x=c))