首页 > 后端开发 > Python教程 > 为什么我在Python中不显式调用线程时线程执行异常?

为什么我在Python中不显式调用线程时线程执行异常?

Linda Hamilton
发布: 2024-11-09 15:48:02
原创
322 人浏览过

Why Does My Thread Execution Anomalous When I Don't Explicitly Invoke Threads in Python?

线程执行异常:揭秘过早线程调用

在 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中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板