如何用Python同时启动大量线程并统计总执行时间?
问题原因与解决方案
核心问题
你当前的代码中,在同一个循环里调用threads[i].start()后立刻执行threads[i].join(),这会导致程序必须等当前线程完全执行完毕,才会启动下一个线程,最终所有线程串行执行,总耗时等于所有线程执行时间的总和。
正确实现方式
只需要把线程的启动和等待操作拆成两个独立循环:先一次性启动所有线程,再统一等待所有线程执行结束。这样所有线程就能并行运行,总耗时会接近单个线程的执行时间(和你手动创建8个线程的效果一致)。
修改后的代码示例:
import threading import time def TypeA(): # 模拟TypeA的执行逻辑,这里以休眠2秒为例 time.sleep(2) def TypeB(): # 模拟TypeB的执行逻辑,这里以休眠2秒为例 time.sleep(2) threads = {} # 创建50个TypeA线程 for i in range(50): threads[i] = threading.Thread(target=TypeA) # 创建50个TypeB线程 for i in range(50, 100): threads[i] = threading.Thread(target=TypeB) programStartTime = time.time() # 第一步:批量启动所有线程 for i in range(100): threads[i].start() # 第二步:统一等待所有线程执行完成 for i in range(100): threads[i].join() programEndTime = time.time() totalProgramTime = programEndTime - programStartTime print(f"总执行时间:{totalProgramTime:.2f}秒")
额外优化建议
可以用列表代替字典存储线程,写法更简洁:
threads = [] # 添加50个TypeA线程 for _ in range(50): threads.append(threading.Thread(target=TypeA)) # 添加50个TypeB线程 for _ in range(50): threads.append(threading.Thread(target=TypeB)) # 启动所有线程 for thread in threads: thread.start() # 等待所有线程结束 for thread in threads: thread.join()
如果线程数量更多,也可以使用concurrent.futures.ThreadPoolExecutor来更高效地管理线程,但对于100个线程来说,直接用循环启动已经足够简单高效。
内容的提问来源于stack exchange,提问作者Canberk Ekinci
相关产品推荐
相关产品推荐

