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

CPU密集任务下Python多线程竟快于单线程?WSL Ubuntu独有异常

WSL Ubuntu下Python多线程跑CPU密集型任务反超单线程的异常解析

我们都知道CPython的GIL全局解释器锁机制:多线程无法真正利用多核CPU,同一时间只有一个线程能执行Python字节码,所以CPU密集型任务用多线程理论上应该比单线程更慢,多线程只适合处理I/O密集型场景。但在WSL Ubuntu环境的Python中做实验时,却出现了反常识的结果:

  • 单线程执行CPU密集型任务平均耗时2.2秒
  • 多线程执行平均耗时1.5秒(反而比单线程快)
  • 多进程执行符合预期,平均耗时1秒(最快)

而且这个异常只出现在WSL Ubuntu中,其他环境下单线程速度确实比多线程更快。

下面是用于对比的三个实验代码:

示例1:单线程顺序执行任务

import time 
import math

nums = [ 8, 7, 8, 5, 8]

def some_computation(n):
    counter = 0
    for i in range(int(math.pow(n,n))):
        counter += 1

if __name__ == '__main__':
    start = time.time()
    for i in nums:
        some_computation(i)
    end = time.time()
    print("Total time of program execution : ", round(end-start, 4) )

示例2:多线程执行任务

import threading
import time 
import math

nums = [ 8, 7, 8, 5, 8]
def some_computation(n):
    counter = 0
    for i in range(int(math.pow(n,n))):
        counter += 1
    
if __name__ == '__main__':
    start = time.time()
    threads = []
    for i in nums: 
        x = threading.Thread(target=some_computation, args=(i,))
        threads.append(x)
        x.start()
    for t in threads:
        t.join()
    end = time.time()
    print("Total time of program execution : ", round(end-start, 4) )

示例3:多进程并行执行任务

from multiprocessing import Pool
import time
import math

nums = [ 8, 7, 8, 5, 8]
def some_computation(n):
    counter = 0
    for i in range(int(math.pow(n,n))):
        counter += 1

if __name__ == '__main__':
    start = time.time()
    pool = Pool(processes=3)
    for i in nums:
        pool.apply_async(some_computation, [i])
    pool.close()
    pool.join()
    end = time.time()
    print("Total time of program execution : ", round(end-start, 4) )

异常原因的可能方向

1. WSL的CPU调度特殊性

WSL2依赖Windows内核的调度器,和原生Linux的调度逻辑不同。当Python线程因GIL释放进入等待状态时,Windows调度器可能会把线程调度到不同的物理核心上。虽然GIL限制了同一时间只有一个线程执行Python代码,但如果线程切换时能利用不同核心的缓存,或者减少单线程独占核心时的热节流影响,反而可能降低整体耗时。

2. 简单计算任务的GIL开销极低

你的计算任务是纯循环累加,核心逻辑(range生成、整数加法)都是CPython底层的C实现,Python字节码占比极低。这种场景下,GIL的释放和切换开销几乎可以忽略,而多线程能利用CPU的超线程特性——WSL可能更好地适配了超线程调度,让多个线程在同一物理核心的不同逻辑核心交替执行,变相提升了执行效率。

3. 单线程的资源分配限制

WSL环境下,单线程进程可能没有被Windows调度器分配到完整的CPU时间片或核心资源;而多线程进程触发了调度器的资源调整,获得了更多的CPU执行时间,导致整体速度反超。

4. GIL释放机制的适配差异

CPython默认每隔100条字节码指令就会释放GIL,允许其他线程抢占。在WSL环境中,线程上下文切换的延迟比原生Linux更低,切换开销小于单线程持续执行时的隐性损耗(比如缓存失效),最终让多线程的整体耗时更短。

验证方法

可以通过以下操作进一步定位原因:

  • 给计算任务加入更多Python级别的逻辑(比如字符串操作、对象实例化),降低C实现的占比,观察多线程是否回到比单线程慢的状态
  • 用Windows任务管理器或htop(WSL内)观察不同实验的CPU核心使用情况,确认多线程是否真的利用了多个逻辑核心
  • 通过sys.setcheckinterval()调整GIL释放间隔,对比执行时间的变化

内容的提问来源于stack exchange,提问作者bad programmer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 08:06:21