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))