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

Python如何实现线程按顺序等待触发条件 替代低效忙等实现方案

解决方案

你当前使用的忙等实现会持续占用CPU核心,效率极低,Python标准库threading模块提供的原生同步原语可以满足你的需求,不需要手动设置等待时长,条件满足时线程会被自动唤醒。

方案1:使用Condition条件变量

这是通用性最强的实现方式,通过条件变量实现自动阻塞等待:

import threading

# 全局共享状态
cond = threading.Condition()
current_print_num = 0

def worker(thread_num, data):
    global current_print_num
    # 先执行计算逻辑,保证多线程计算并行执行
    # 此处替换为你的实际计算代码
    compute_result = f"线程{thread_num}计算结果:{data * 10}"
    
    # 等待输出条件满足
    with cond:
        # 条件不满足时自动阻塞,释放CPU资源
        cond.wait_for(lambda: thread_num == current_print_num)
        print(compute_result)
        current_print_num += 1
        # 通知所有等待线程检查条件
        cond.notify_all()

# 测试:创建5个线程,按0~4的顺序分配编号
if __name__ == "__main__":
    thread_count = 5
    threads = []
    for i in range(thread_count):
        t = threading.Thread(target=worker, args=(i, i))
        threads.append(t)
        t.start()
    # 等待所有线程执行完成
    for t in threads:
        t.join()

该方案的优势是适配线程数量动态变化的场景,计算逻辑完全并行不受输出顺序影响。

方案2:使用Event实现线程逐个通知

如果线程数量固定,可以用Event实现更轻量的前序唤醒后序逻辑:

import threading

thread_count = 5
# 给每个线程分配一个Event对象
events = [threading.Event() for _ in range(thread_count)]
# 默认触发第一个线程的Event,保证首个输出正常执行
events[0].set()

def worker(thread_num, data):
    # 先执行计算逻辑
    compute_result = f"线程{thread_num}计算结果:{data * 10}"
    
    # 等待自己的Event被触发
    events[thread_num].wait()
    print(compute_result)
    # 触发下一个线程的Event,最后一个线程无需操作
    if thread_num + 1 < thread_count:
        events[thread_num + 1].set()

if __name__ == "__main__":
    threads = []
    for i in range(thread_count):
        t = threading.Thread(target=worker, args=(i, i))
        threads.append(t)
        t.start()
    for t in threads:
        t.join()

该方案实现逻辑更简单,仅需要通知下一个线程,不需要广播所有等待线程,资源消耗更低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 01:09:03