ThreadPoolExecutor处理CPU密集型任务为何远超预期速度?
为什么ThreadPoolExecutor处理你的任务能大幅提速?
你对GIL的认知没错:纯CPU密集型任务用ThreadPoolExecutor无法获得多核并行优势,因为同一时间只有一个线程能执行Python字节码。但你的测试代码里的cpu_slow_function并不是真正的纯CPU密集任务——问题出在循环里的time.time()调用。
核心原因:
time.time()是系统调用,Python在执行这类C实现的外部操作时,会主动释放GIL- 当一个线程调用
time.time()等待系统返回结果时,其他线程可以立即获取GIL并执行自身的任务 - 你的循环逻辑是不断调用
time.time()来判断是否继续,这会频繁触发GIL的释放与线程切换,让多个线程实际上能并行推进,所以总耗时远低于串行执行的50秒
验证真正的CPU密集任务
如果要测试纯CPU密集场景,把循环改成不依赖系统调用的纯计算,比如:
@measure_execution_time def pure_cpu_function(item): counter = 0 # 固定次数的纯运算循环,无系统调用 for _ in range(10**7): counter += 1 return item, counter
用这个函数测试的话,ThreadPoolExecutor的总耗时会和串行执行差不多,而ProcessPoolExecutor才能利用多核CPU真正缩短耗时。
内容的提问来源于stack exchange,提问作者JaviOverflow
相关产品推荐
相关产品推荐

