Python(threading.Thread.join())

news/2025/4/2 6:02:41/文章来源:https://www.cnblogs.com/keye/p/18802073

目录
  • 1. 语法
  • 2. 示例代码
    • 2.1 基本用法:等待线程执行完成
    • 2.2 设置超时时间 timeout
    • 2.3 多线程并行 join()
  • 3. join() 相关特性
    • 3.1 join() 只对 start() 过的线程有效
    • 3.2 join() 不能用于主线程等待自己
    • 3.3 join() 不能强制结束线程
  • 4. join() 的实际应用场景
  • 5. 总结

threading.Thread.join() 是 Python threading 模块中的一个方法,用于阻塞调用它的线程,直到目标线程执行完成(即 Thread 对象的 run() 方法执行结束)。该方法通常用于确保多线程程序按照预期的顺序执行,避免主线程过早退出或与子线程出现资源竞争问题。




1. 语法

thread.join(timeout=None)
  • timeout(可选):指定最多等待目标线程终止的时间(单位:秒)。如果未提供 timeout,则主线程会无限期等待目标线程执行完成。
  • join() 不会终止线程,只是等待它结束。



2. 示例代码

2.1 基本用法:等待线程执行完成

import threading
import timedef worker():print("线程开始执行...")time.sleep(2)print("线程执行完毕!")# 创建线程
t = threading.Thread(target=worker)
t.start()print("主线程等待子线程完成...")
t.join()  # 阻塞主线程,直到 t 线程执行完毕
print("主线程继续执行!")

输出示例:

主线程等待子线程完成...
线程开始执行...
线程执行完毕!
主线程继续执行!

主线程会等待 t 线程执行完毕后,才会继续向下运行。



2.2 设置超时时间 timeout

import threading
import timedef worker():print("线程开始执行...")time.sleep(5)print("线程执行完毕!")t = threading.Thread(target=worker)
t.start()print("主线程等待 2 秒...")
t.join(timeout=2)  # 最多等待 2 秒
print("主线程继续执行!(不管子线程是否完成)")

可能的输出:

主线程等待 2 秒...
线程开始执行...
主线程继续执行!(不管子线程是否完成)
线程执行完毕!

主线程最多等待 2 秒,之后会继续执行,即使 t 线程尚未完成。



2.3 多线程并行 join()

在多个线程中使用 join() 以确保所有线程都执行完毕:

import threading
import timedef worker(n):print(f"线程 {n} 开始")time.sleep(n)print(f"线程 {n} 结束")threads = []for i in range(3):t = threading.Thread(target=worker, args=(i+1,))t.start()threads.append(t)# 等待所有线程执行完成
for t in threads:t.join()print("所有线程执行完毕,主线程继续!")

可能的输出:

线程 1 开始
线程 2 开始
线程 3 开始
线程 1 结束
线程 2 结束
线程 3 结束
所有线程执行完毕,主线程继续!

join() 确保所有子线程都执行完毕后,主线程才会继续执行。




3. join() 相关特性

3.1 join() 只对 start() 过的线程有效

如果 join() 在一个尚未启动的线程上调用,它不会生效:

import threadingt = threading.Thread(target=lambda: print("线程运行"))
t.join()  # 这里不会阻塞,因为线程 t 还没 start()
print("主线程继续执行")

输出:

主线程继续执行

解释: t.join() 立即返回,因为 t 线程根本没有 start() 过。



3.2 join() 不能用于主线程等待自己

如果 join() 在主线程中对自身调用,会导致死锁

import threading
import timedef worker():print("子线程执行中...")time.sleep(2)print("子线程执行完毕")t = threading.Thread(target=worker)
t.start()threading.current_thread().join()  # 试图让主线程等待自己

错误:

RuntimeError: cannot join current thread

解释: join() 会让调用它的线程阻塞等待目标线程结束,但如果主线程调用 join() 来等待自己,主线程就会永远卡住,导致死锁。



3.3 join() 不能强制结束线程

import threading
import timedef worker():while True:print("线程运行中...")time.sleep(1)t = threading.Thread(target=worker)
t.start()time.sleep(3)
t.join(timeout=1)  # 主线程等待 1 秒
print("主线程继续执行")

输出(不会停止 t 线程):

线程运行中...
线程运行中...
线程运行中...
主线程继续执行
线程运行中...
...

解释: join() 只是等待线程结束,而不是强制终止线程。要停止线程,通常需要在 worker() 里用标志位来手动退出循环。



4. join() 的实际应用场景

  1. 确保主线程等待子线程完成(避免主线程退出导致子线程被强制终止)。
  2. 控制线程执行顺序,比如一个线程的任务依赖于另一个线程的结果。
  3. 使用 timeout 限制等待时间,防止子线程运行时间过长导致主线程被无限阻塞。



5. 总结

  • join() 用于等待线程完成,阻塞主线程或调用它的线程。
  • join(timeout) 允许设定超时时间,不会强制终止线程。
  • 不能在未 start() 的线程上调用 join()
  • 不能对当前线程调用 join(),否则会死锁。
  • 不能强制终止线程,仅用于等待。

你可以在你的多线程应用中使用 join() 来保证线程按照预期的顺序执行,提高程序的稳定性和可靠性! 🚀



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/908628.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ZKmall模版商城前后端分离秒级响应架构深度解析

在当今的电商领域,用户体验和响应速度已成为决定平台竞争力的关键因素。ZKmall模版商城,作为一款高性能的电商平台解决方案,通过采用前后端分离架构,实现了秒级响应,为用户带来了极致的购物体验。本文将深度解析ZKmall模版商城的前后端分离秒级响应架构,探讨其背后的技术…

UESTC 23-th ACM-ICPC 初赛 Q. 校车

这东西其实蛮像最小斯坦纳树,不过我们通过状压DP的思想来讲一讲这个题。 形式化题意:考虑一共有 \(n\) 个点,\(m\) 条无向边,你需要从图中选出至多 \(K\) 条闭合路径,使得所有 \(w\) 个关键点都被覆盖,使得最长路径最小。 容易发现 \(n \le 500\),因此我们可以通过 Floy…

360度全景环视(AVM Around View Monitor)简介

AVM(Around View Monitor),中文:全景环视系统。 在自动驾驶领域,AVM属于自动泊车系统的一部分,是一种实用性极高、可大幅提升用户体验和驾驶安全性的功能。利用车身四周摄像头,拼接出以车身为中心的360环视画面,直接鸟瞰车身周边情况。支持多种车型,具有4路、6路、或前…

htb Code

先快速扫描 rustscan -a 10.10.11.62PORT STATE SERVICE REASON 22/tcp open ssh syn-ack ttl 63 5000/tcp open upnp syn-ack ttl 63 发现有一个5000端口 nmap扫描 nmap -sC -sV -p 5000 -v -Pn -T4 10.10.11.62发现是一个python的命令执行的环境 接下来进行沙…

敏捷开发的终极形态?2025年必试的5款集成混沌工程的项目管理黑科技

随着企业数字化转型的加速,敏捷开发已从单纯的高效迭代演变为融合混沌工程的“韧性敏捷”模式。混沌工程通过主动注入系统故障,验证系统在异常条件下的稳定性,成为保障敏捷开发持续交付的关键技术。据Gartner预测,到2025年,70%的企业将在敏捷流程中集成混沌工程以增强系统…

SQL SERVER日常运维巡检系列之-实例级参数

前言做好日常巡检是数据库管理和维护的重要步骤,而且需要对每次巡检日期、结果进行登记,同时可能需要出一份巡检报告。本系列旨在解决一些常见的困扰: 不知道巡检哪些东西不知道怎么样便捷体检机器太多体检麻烦生成报告困难,无法直观呈现结果 实例的参数对系统性能和稳定…

How Memory is Implemented in LLM-based Agents?

原文链接:https://medium.com/@parklize/how-memory-is-implemented-in-llm-based-agents-f08e7b6662ff在之前的文章中,我们讨论了大语言模型(LLM)的局限性以及LLM与基于LLM的智能体之间的关系。 智能体为LLM带来的关键增强功能之一是记忆能力,这有助于克服LLM的上下文长度…

运行MBConicHulls教程

为了运行MBConicHulls(a Mathematica package to evaluate N-fold MB integrals)需要安装啥 目录环境Mathematica 13.0.1 Linux版 ✅MultivariateResidues.m (计算多变量余数)✅TOPCOM(一个用于计算三角剖分和相关结构的软件包) ✅前置安装需求步骤-已跑通安装完了测试一下…

信创概念股投资回报率最高的五家公司

信创产业作为近年来备受瞩目的领域,其发展态势对投资者具有极大的吸引力。探寻信创概念股中投资回报率最高的五家公司,对于投资者来说至关重要。这不仅能为他们的资金找到更具潜力的投向,也有助于把握行业发展的脉搏,在复杂多变的市场中获取丰厚的回报。随着信息技术的飞速…

信创国产化背景下人才培养的四大策略

信创国产化是当前我国科技发展的重要战略方向,旨在实现信息技术领域的自主可控,减少对国外技术的依赖,保障国家信息安全。在这一背景下,人才的培养显得尤为关键。信创国产化涉及众多领域和技术,从芯片、操作系统、数据库到各类应用软件,每一个环节都需要专业人才的支撑。…

信创行业政策支持与市场机遇探讨

信创,即信息技术应用创新产业,旨在实现信息技术领域的自主可控,保障国家信息安全。近年来,随着全球政治经济形势的变化以及科技竞争的日益激烈,信创行业迎来了前所未有的发展契机。政策的大力支持为信创行业筑牢了坚实的发展根基,而广阔的市场则为其提供了无限的增长可能…