Python多线程在调用start()前提前执行?同步启动问题排查
问题原因
你代码里的核心问题是启动第一个线程后立刻调用了t1.join():
join()方法会强制阻塞当前的主线程,必须等t1线程的所有任务执行完,才会继续往下运行代码。所以t2线程是在t1彻底跑完之后才被启动的,根本没机会和t1并行。- 至于
print("a")在最后输出,是因为你把它写在了两个线程的join()之后,主线程得等t2也执行完,才会走到这一行代码。
举个你大概率写的错误代码示例:
import threading import time def task(): print(f"{threading.current_thread().name} 启动") time.sleep(1) print(f"{threading.current_thread().name} 结束") # 错误操作:启动t1后直接join,卡死主线程 t1 = threading.Thread(target=task, name="线程1") t1.start() t1.join() t2 = threading.Thread(target=task, name="线程2") t2.start() t2.join() print("a")
对应的输出就是:
线程1 启动
线程1 结束
线程2 启动
线程2 结束
a
解决办法
1. 基础并行启动
先把所有线程都启动,再统一调用join()等待它们结束。这样两个线程会被同时启动,实现并行执行:
import threading import time def task(): print(f"{threading.current_thread().name} 启动") time.sleep(1) print(f"{threading.current_thread().name} 结束") # 先创建并启动所有线程 t1 = threading.Thread(target=task, name="线程1") t2 = threading.Thread(target=task, name="线程2") t1.start() t2.start() # 再统一等待线程结束 t1.join() t2.join() print("a")
输出会类似(线程调度顺序可能略有差异):
线程1 启动
线程2 启动
线程1 结束
线程2 结束
a
2. 精确同步启动(进阶)
如果需要两个线程完全同时开始执行任务逻辑(消除线程启动时的微小时间差),可以用threading.Barrier做同步屏障:
import threading import time # 创建屏障,需要等2个线程都到达后才放行 sync_barrier = threading.Barrier(2) def task(): print(f"{threading.current_thread().name} 准备完毕,等待同步") sync_barrier.wait() # 阻塞到所有线程都到达这里 print(f"{threading.current_thread().name} 开始执行任务") time.sleep(1) print(f"{threading.current_thread().name} 任务结束") t1 = threading.Thread(target=task, name="线程1") t2 = threading.Thread(target=task, name="线程2") t1.start() t2.start() t1.join() t2.join() print("a")
输出效果:
线程1 准备完毕,等待同步
线程2 准备完毕,等待同步
线程1 开始执行任务
线程2 开始执行任务
线程1 任务结束
线程2 任务结束
a
内容的提问来源于stack exchange,提问作者apayol
相关产品推荐
相关产品推荐

