在 Python 中创建线程时,使用 start( 显式调用它们至关重要) 方法。然而,在线程创建语法中调用目标函数的情况下,会出现一个有趣的问题。
考虑下面的代码片段:
t1 = threading.Thread(target=self.read()) print("something") t2 = threading.Thread(target=self.runChecks(), args=(self,))
令人惊讶的是,print 语句永远不会执行,因为 self.read 无限期地运行,导致程序无法到达下一行。这种行为似乎违反直觉,因为调用 t1.start() 应该启动线程执行并允许程序继续进行。
问题出在 self.read() 后面的括号中。在 Python 中,函数后面的括号会调用它,因此以下代码:
target=self.read()
实际上调用 self.read 并将其返回值作为目标参数传递给 Thread。但是,Thread 需要函数引用,而不是返回值。要纠正此行为,只需删除括号并在创建线程后显式调用 t1.start() 即可:
t1 = threading.Thread(target=self.read) t1.start() print("something")
当目标函数需要参数,请使用 threading.Thread 的 args 或 kwargs 参数。或者,使用 lambda 函数,如下所示:
thread = threading.Thread(target=f, args=(a, b), kwargs={'x': c})
或
thread = threading.Thread(target=lambda: f(a, b, x=c))
请记住,如果使用 lambda,则函数的参数在调用 lambda 时计算,而不是在调用 lambda 时计算它被定义了。如果在线程调度之前重新分配变量,这可能会导致意外结果。
以上是为什么我在Python中不显式调用线程时线程执行异常?的详细内容。更多信息请关注PHP中文网其他相关文章!