当前位置: 首页 > 面试题库 >

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

墨雨华
2023-03-14
问题内容
t1=threading.Thread(target=self.read())
print("something")
t2=threading.Thread(target=self.runChecks(), args=(self,))

self.read无限期运行,因此该程序永远不会到达print终点。不打电话t1.start()怎么办?(即使我这样称呼,它也会开始运行并转到下一行,不是吗?)


问题答案:

由于尾随的()target=self.read(),你正在运行self.read在错误的线程,在 当前 线程-而不是新线程你创建-并传递
返回值
的的self.read召唤为target的说法ThreadThread期望传递给函数以进行调用,因此只需删除括号并记住启动线程即可:

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

虽然看出来,如果你选择的拉姆达-
拉姆达将查找fab,并c在使用时,而不是在lambda被定义,因此如果您重新分配任何这些变量的线程调度之前可能会得到意想不到的结果(这可能即使您start立即致电,也要花任意时间)。



 类似资料:
  • 有许多linux发行版可以选择. 我们将会选择三种流行的发行版来尽可能的包括所有听众来避免发行版战争. 基于他们使用系统的包管理系统, 许多linux发行版分成2组. 一组使用RPM(Red Hat Package Manager), 而另一组使用dpkg包管理器. 我们选择两种基于RPM的发行版, CentOS和SUSE, 在企业中流行. 取代使用Debian作为一个基于dpkg的发行版, 我们

  • 如果你刚从后端转到前端,可能会被目前前端(表面的)工程复杂度惊吓到,但是放心,使用 vue-cli 从模板创建项目可以快速开始编码、构建,仅仅是几行简单的命令不是么? 在使用 VUX 之前需要你至少已经会使用 Vue,同时需要你大概了解 Node.js,npm,cnpm,yarn 这些东西。 建议 Node.js 版本在 7.6.0 以上。 相关工具 WeUI VUX 样式基于 WeUI,但是你不

  • Step 1:下载依赖 下载Docker - 该教程将使用Docker. 为了更快的起步,这是最好的选择.编译源码来构建生产环境也是一个选择, 但可能会耗费数小时并且可能会遭遇到build errors. Step2 : 初始化开发文件夹,并以此为目录 你需要创建一个目录来进行接下来的学习, 建议你在本地磁盘创建一个contracts文件夹: mkdir contracts cd contract

  • 问题内容: 好像我遇到了本不应该出现的问题……但我想寻求帮助。 这里有一些我没有得到的解释。 具有两个简单的类,其中一个引用另一个,如下所示; 我收到注释的编译错误。有人可以告诉我该怎么办吗? 非常感谢任何好人的帮助! 问题答案: 正如 vadian 正确指出的 那样, 您应该在以下情况下创建一个: 您不能为 依赖 于另一个实例属性的存储属性提供默认值。

  • 我在XML配置文件中有一些信息(例如log4j2 logs save文件夹的路径),希望在Spring开始加载之前加载它们。但是在Spring和抛出异常之前,都不会执行或(log4j2找不到系统属性,我想在XML配置文件加载期间定义它)。 如何在Spring开始加载之前运行一些方法? 我使用Spring Boot(Start.class作为切入点)。 运行输出: 2014-12-20 14:15:

  • 是否可以强制Hazelcast在调用线程的TransactionalMap上运行put()、replace()和delete()方法?我希望XA事务从写到Hazelcast转移到写到MapStore中的数据库,但是Hazelcast正在排队等待在其他线程上运行的更改,因此它们不在相同的事务上下文中。 我已经将它设置为一个直写持久性,但我看到它将TxnSetOperation排队,并在单独的线程上运