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

