【问题标题】:thread starts running before calling Thread.start线程在调用 Thread.start 之前开始运行
【发布时间】:2012-08-01 07:40:16
【问题描述】:
t1=threading.Thread(target=self.read())
print("something")
t2=threading.Thread(target=self.runChecks(), args=(self,))
self.read 无限期地运行,所以程序永远不会到达print 行。如果不调用t1.start(),这怎么可能? (即使我这么叫,它也应该开始运行并继续下一行,不是吗?)
【问题讨论】:
标签:
python
multithreading
python-multithreading
【解决方案1】:
由于target=self.read() 上的尾随(),您在错误的线程中运行self.read,当前 线程 - 而不是您正在创建的新线程 - 并传递self.read 调用的 返回值 作为 Thread 的 target 参数。 Thread 期望传递一个函数来调用,所以只需去掉括号并记住启动线程:
t1=threading.Thread(target=self.read)
t1.start()
print("something")
对于需要参数的目标,您可以使用 args 和 kwargs 参数到 threading.Thread,或者您可以使用 lambda。例如,要在线程中运行f(a, b, x=c),您可以使用
thread = threading.Thread(target=f, args=(a, b), kwargs={'x': c})
或
thread = threading.Thread(target=lambda: f(a, b, x=c))
如果您选择 lambda,请注意 - lambda 将在使用时查找 f、a、b 和 c,而不是在定义 lambda 时查找,因此您可以如果您在安排线程之前重新分配这些变量中的任何一个,则会得到意想不到的结果(即使您立即调用 start 也可能花费任意时间)。