You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python多线程join()方法作用解析:为何实际结果与预期不符?

关于Python Thread.join()方法的误解澄清

你的核心误解在于对join()方法作用对象的认知错误——join()只会阻塞调用它的线程(这里是主线程),不会对其他已经启动的线程产生任何停止/暂停的影响。

代码运行逻辑拆解

先补全你代码中遗漏的导入,完整代码如下:

from threading import Thread
import time

def do_something(i):
    print("Sleeping...")
    time.sleep(i)
    print(f"Done sleeping {i}")

start = time.perf_counter()

t1, t2 = Thread(target=do_something, args=(1,)), Thread(target=do_something, args=(10,))

t1.start()  # t1启动,开始执行do_something(1)
t2.start()  # t2启动,开始执行do_something(10)

t2.join()  # 主线程进入阻塞状态,直到t2执行完毕才会继续往下走
print("t2 joined")
t1.join()  # 此时t1已经执行完成,主线程直接跳过阻塞
print("t1 joined")

实际输出的原因

t1和t2启动后是并发运行的:

  • t1仅需休眠1秒,会先完成任务,输出Done sleeping 1
  • t2需要休眠10秒,所以10秒后才会输出Done sleeping 10
  • 主线程在调用t2.join()后,会一直等待t2结束,所以t2 joined会在t2完成后打印;而调用t1.join()时,t1早已执行完毕,这个join会立刻返回,接着打印t1 joined

你预期输出的误区

你以为调用t2.join()会让t1停止运行,这是完全错误的。join()没有任何暂停或终止其他线程的能力,它的唯一作用就是让当前调用它的线程等待目标线程完成,其他已经启动的线程会正常执行,不受影响。

如果想要实现你预期的输出顺序(t2先完成,t1再完成),不能让两个线程同时启动,而是要串行执行:

t2.start()
t2.join()
t1.start()
t1.join()

但这样就失去了多线程并发的意义,变成了单线程式的串行执行。

内容的提问来源于stack exchange,提问作者Armaho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 06:10:30