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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 15:40:18