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
相关产品推荐
相关产品推荐

