python interpreter Python的GIL锁死你多线程?CPU密集任务跑得比单线程还慢,气炸了

📅 2026/7/13 1:04:46 👁️ 阅读次数 📝 编程学习
python interpreter Python的GIL锁死你多线程?CPU密集任务跑得比单线程还慢,气炸了

开发者一直困惑的多线程机制是, 明明开启了多线程, 处理CPU密集型任务时, 性能却没提升, 甚至比单线程更慢。其背后核心原因是全局解释器锁(GIL), 它是面试高频考察难点, 也是技术社区常年讨论热门话题。

把GIL的底层原理进行拆解, 对多线程失效的核心原因予以分析, 将CPU密集型与IO密集型任务的差异相结合, 给出正确的并发方案, 搭配上可直接运行的代码, 助你把GIL彻底弄明白, 躲开多线程开发陷阱。

### 一、难题场景再现

倘若我们要对从1开始的一系列数进行累加和的计算, 这可是一项典型的、属于CPU密集型的任务, 我们试着运用单线程以及多线程这两种不同的方式去达成, 满心希望多线程能够借助多核CPU来提升性能, 然而最终呈现出来的结果却完全超出了我们的预料。

import threading import time # 计算1到n的累加和(CPU密集型任务) def calculate_sum(n): total = 0 for i in range(1, n+1): total += i return total # 单线程实现 def single_thread(): start_time = time.time() result = calculate_sum(10000000) end_time = time.time() print(f"单线程结果:{result},耗时:{end_time - start_time:.4f}秒") # 多线程实现(分两段计算,模拟多核并行) def multi_thread(): start_time = time.time() result1 = 0 result2 = 0 # 线程1:计算1到5000000 def task1(): nonlocal result1 result1 = calculate_sum(5000000) # 线程2:计算5000001到10000000 def task2(): nonlocal result2 result2 = calculate_sum(5000000) + 5000000 * 5000000 t1 = threading.Thread(target=task1) t2 = threading.Thread(target=task2) t1.start() t2.start() t1.join() t2.join() total_result = result1 + result2 end_time = time.time() print(f"多线程结果:{total_result},耗时:{end_time - start_time:.4f}秒") if __name__ == "__main__": single_thread() multi_thread()

执行结果显现出来: 多线程所耗费的时间不但没有降低, 反倒比单线程还要长。这跟我们对于多线程的认识相互矛盾——为何多线程没办法加快CPU密集型任务的速度呢? 答案便是GIL的约束。

### 二、难题核心解析

要明白这个问题, 首先得清楚GIL的实质, 那便是在解释器里存在的一个全局锁, 它保证同一时刻, 仅有一个线程能够去执行字节码。换句话讲, 哪怕你的电脑是具备多核CPU特质的, 其多线程也不能够达成真正意义上的并行, 而仅仅只能达成并发, 也就是交替执行。

GIL的工作机制的核心要点:

1. GIL所具备的特性, 其他的解释器, 像是PyPy等, 并不一定就具备GIL这样的特性。

2. 同一时间点, 仅有一个线程持有GIL, 进而执行字节码;别的线程处在等待状况, 直至GIL被释放。

3. GIL会在线程执行了一定的时间, 这个时间是默认的5毫秒, 或者是遇到IOR操作的时候进行释放, 从而使得其他的线程可以拥有执行的机会。

在CPU密集型任务当中, 线程差不多时时刻刻都在搞字节码的相关执行操作。话说这的时候, GIL释放的时机是少之又少的, 多个线程就只能轮流着来了, 没办法凭借多核CPU的优势去搞;与此同时呢, 线程切换这件事本身就会耗费额外的系统资源, 结果致使多线程所花费的时间比单线程还要长。

可针对IO密集型任务这么说(像网络请求、文件读写这类任务), 在这种情形下, 线程的多半时间都处于等待IO完成的状态(并非去执行字节码), 这个时候GIL即将会被释放掉, 别的线程将能够执行, 鉴于这样, 所以采取多线程的方式能够将IO密集型任务的性能给提升起来。

### 三、正确解决方案(突破GIL限制)

有三种常用方案, 针对CPU密集型任务, 用以突破GIL的限制, 它们分别是, 多进程, 扩展, 以及针对特定场景的异步编程。其中, 多进程是最常用且最易实现的方案, 因为每个进程都具有独立的解释器以及GIL, 能够真正达成多核并行。

import multiprocessing import time # 计算1到n的累加和(CPU密集型任务) def calculate_sum(n): total = 0 for i in range(1, n+1): total += i return total # 多进程实现(真正利用多核CPU) def multi_process(): start_time = time.time() # 创建两个进程,分两段计算 p1 = multiprocessing.Process(target=calculate_sum, args=(5000000,)) p2 = multiprocessing.Process(target=calculate_sum, args=(5000000,)) # 启动进程 p1.start() p2.start() # 等待进程执行完成 p1.join() p2.join() # 计算总结果(第二段是5000001到10000000,需加上5000000*5000000) total_result = calculate_sum(5000000) + (calculate_sum(5000000) + 5000000 * 5000000) end_time = time.time() print(f"多进程结果:{total_result},耗时:{end_time - start_time:.4f}秒") # 单线程对比 def single_thread(): start_time = time.time() result = calculate_sum(10000000) end_time = time.time() print(f"单线程结果:{result},耗时:{end_time - start_time:.4f}秒") if __name__ == "__main__": single_thread() multi_process()

运行结果会明显地被看到, 多进程所耗费的时间远远低于单线程, 切实达成了性能方面得到提升。这是由于每一个进程都拥有独立的GIL, 能够充分借助多核CPU的优势, 从而并行去执行任务。

### 四、进阶注意事项与避坑技巧

1. 进行并发方案的确定是依据任务类型来开展的, 针对于CPU密集型的任务而言会采用多进程的方式, 要是IO密集型的任务, 则选用多线程又或者异步编程的途径, 以此来防止因为方案使用错误而致使性能出现下降的情况。

2. 多进程所存在的开销是, 进程的创建开销会比线程大, 并且进程的切换开销也比线程大, 所以在那种任务量比较小的状况之下, 多进程拥有的优势并不显著, 甚至有可能会比单线程运行得更慢, 这就需要依据任务的规模来进行选择。

3. 不同进程之间的通信情况是, 多个进程彼此之间没办法直接去共享内存, 需要借助Queue、Pipe之类的那样形式来开展通信, 防止因为过于频繁地进行通信而致使性能产生损耗。

4. GIL的未来情况, 在3.12时对GIL做了优化, 有关于“per - GIL”被引入, 这能够让多个解释器去共享进程的方式得以实现, 并且每个解释器都具备独立的GIL了, 在这样的情况下进一步提升了多线程当中的性能, 不过一直到现在都还没有将GIL完全移除掉。

五、总结

GIL属于多线程开发里的核心陷阱, 好多开发者错误地认为多线程能让所有任务提速,然而却忽视了GIL针对CPU密集型任务的限制。要记住核心结论: GIL对多线程的并行执行形成了限制, CPU密集型任务得采用多进程, IO密集型任务则采用多线程或者异步编程。

熟练把握GIL的原理, 精准抉择并发方案, 这能够助力你于实际开发当中躲开性能陷阱, 撰写出高效的并发代码, 而且还是高级开发者必须所具备的技能。WWw.BdX3.cN/pdds/31245.html
WWw.BdX3.cN/pdds/31246.html
WWw.BdX3.cN/pdds/31247.html
WWw.BdX3.cN/pdds/31248.html
WWw.BdX3.cN/pdds/31249.html
WWw.BdX3.cN/pdds/31250.html
WWw.BdX3.cN/pdds/31251.html
WWw.BdX3.cN/pdds/31252.html
WWw.BdX3.cN/pdds/31253.html
WWw.BdX3.cN/pdds/31254.html
WWw.BdX3.cN/pdds/31255.html
WWw.BdX3.cN/pdds/31256.html
WWw.BdX3.cN/pdds/31257.html
WWw.BdX3.cN/pdds/31258.html
WWw.BdX3.cN/pdds/31259.html
WWw.BdX3.cN/pdds/31260.html
WWw.BdX3.cN/pdds/31261.html
WWw.BdX3.cN/pdds/31262.html
WWw.BdX3.cN/pdds/31263.html
WWw.BdX3.cN/pdds/31264.html
WWw.BdX3.cN/pdds/31265.html
WWw.BdX3.cN/pdds/31266.html
WWw.BdX3.cN/pdds/31267.html
WWw.BdX3.cN/pdds/31268.html
WWw.BdX3.cN/pdds/31269.html
WWw.BdX3.cN/pdds/31270.html
WWw.BdX3.cN/pdds/31271.html
WWw.BdX3.cN/pdds/31272.html
WWw.BdX3.cN/pdds/31273.html
WWw.BdX3.cN/pdds/31274.html
WWw.BdX3.cN/pdds/31275.html
WWw.BdX3.cN/pdds/31276.html
WWw.BdX3.cN/pdds/31277.html
WWw.BdX3.cN/pdds/31278.html
WWw.BdX3.cN/pdds/31279.html
WWw.BdX3.cN/pdds/31280.html
WWw.BdX3.cN/pdds/31281.html
WWw.BdX3.cN/pdds/31282.html
WWw.BdX3.cN/pdds/31283.html
WWw.BdX3.cN/pdds/31284.html
WWw.BdX3.cN/pdds/31285.html
WWw.BdX3.cN/pdds/31286.html
WWw.BdX3.cN/pdds/31287.html
WWw.BdX3.cN/pdds/31288.html
WWw.BdX3.cN/pdds/31289.html
WWw.BdX3.cN/pdds/31290.html
WWw.BdX3.cN/pdds/31291.html
WWw.BdX3.cN/pdds/31292.html
WWw.BdX3.cN/pdds/31293.html
WWw.BdX3.cN/pdds/31294.html
WWw.BdX3.cN/pdds/31295.html
WWw.BdX3.cN/pdds/31296.html
WWw.BdX3.cN/pdds/31297.html
WWw.BdX3.cN/pdds/31298.html
WWw.BdX3.cN/pdds/31299.html
WWw.BdX3.cN/pdds/31300.html
WWw.BdX3.cN/pdds/31301.html
WWw.BdX3.cN/pdds/31302.html
WWw.BdX3.cN/pdds/31303.html
WWw.BdX3.cN/pdds/31304.html
WWw.BdX3.cN/pdds/31305.html
WWw.BdX3.cN/pdds/31306.html
WWw.BdX3.cN/pdds/31307.html
WWw.BdX3.cN/pdds/31308.html
WWw.BdX3.cN/pdds/31309.html
WWw.BdX3.cN/pdds/31310.html
WWw.BdX3.cN/pdds/31311.html
WWw.BdX3.cN/pdds/31312.html
WWw.BdX3.cN/pdds/31313.html
WWw.BdX3.cN/pdds/31314.html
WWw.BdX3.cN/pdds/31315.html
WWw.BdX3.cN/pdds/31316.html
WWw.BdX3.cN/pdds/31317.html
WWw.BdX3.cN/pdds/31318.html
WWw.BdX3.cN/pdds/31319.html
WWw.BdX3.cN/pdds/31320.html
WWw.BdX3.cN/pdds/31321.html
WWw.BdX3.cN/pdds/31322.html
WWw.BdX3.cN/pdds/31323.html
WWw.BdX3.cN/pdds/31324.html
WWw.BdX3.cN/pdds/31325.html
WWw.BdX3.cN/pdds/31326.html
WWw.BdX3.cN/pdds/31327.html
WWw.BdX3.cN/pdds/31328.html
WWw.BdX3.cN/pdds/31329.html
WWw.BdX3.cN/pdds/31330.html
WWw.BdX3.cN/pdds/31331.html
WWw.BdX3.cN/pdds/31332.html
WWw.BdX3.cN/pdds/31333.html
WWw.BdX3.cN/pdds/31334.html
WWw.BdX3.cN/pdds/31335.html
WWw.BdX3.cN/pdds/31336.html
WWw.BdX3.cN/pdds/31337.html
WWw.BdX3.cN/pdds/31338.html
WWw.BdX3.cN/pdds/31339.html
WWw.BdX3.cN/pdds/31340.html
WWw.BdX3.cN/pdds/31341.html
WWw.BdX3.cN/pdds/31342.html
WWw.BdX3.cN/pdds/31343.html
WWw.BdX3.cN/pdds/31344.html
WWw.BdX3.cN/pdds/31345.html
WWw.BdX3.cN/pdds/31346.html
WWw.BdX3.cN/pdds/31347.html
WWw.BdX3.cN/pdds/31348.html
WWw.BdX3.cN/pdds/31349.html
WWw.BdX3.cN/pdds/31350.html
WWw.BdX3.cN/pdds/31351.html
WWw.BdX3.cN/pdds/31352.html
WWw.BdX3.cN/pdds/31353.html
WWw.BdX3.cN/pdds/31354.html
WWw.BdX3.cN/pdds/31355.html
WWw.BdX3.cN/pdds/31356.html
WWw.BdX3.cN/pdds/31357.html
WWw.BdX3.cN/pdds/31358.html
WWw.BdX3.cN/pdds/31359.html
WWw.BdX3.cN/pdds/31360.html
WWw.BdX3.cN/pdds/31361.html
WWw.BdX3.cN/pdds/31362.html
WWw.BdX3.cN/pdds/31363.html
WWw.BdX3.cN/pdds/31364.html
WWw.BdX3.cN/pdds/31365.html
WWw.BdX3.cN/pdds/31366.html
WWw.BdX3.cN/pdds/31367.html
WWw.BdX3.cN/pdds/31368.html
WWw.BdX3.cN/pdds/31369.html
WWw.BdX3.cN/pdds/31370.html
WWw.BdX3.cN/pdds/31371.html
WWw.BdX3.cN/pdds/31372.html
WWw.BdX3.cN/pdds/31373.html
WWw.BdX3.cN/pdds/31374.html
WWw.BdX3.cN/pdds/31375.html
WWw.BdX3.cN/pdds/31376.html
WWw.BdX3.cN/pdds/31377.html
WWw.BdX3.cN/pdds/31378.html
WWw.BdX3.cN/pdds/31379.html
WWw.BdX3.cN/pdds/31380.html
WWw.BdX3.cN/pdds/31381.html
WWw.BdX3.cN/pdds/31382.html
WWw.BdX3.cN/pdds/31383.html
WWw.BdX3.cN/pdds/31384.html
WWw.BdX3.cN/pdds/31385.html
WWw.BdX3.cN/pdds/31386.html
WWw.BdX3.cN/pdds/31387.html
WWw.BdX3.cN/pdds/31388.html
WWw.BdX3.cN/pdds/31389.html
WWw.BdX3.cN/pdds/31390.html
WWw.BdX3.cN/pdds/31391.html
WWw.BdX3.cN/pdds/31392.html
WWw.BdX3.cN/pdds/31393.html
WWw.BdX3.cN/pdds/31394.html
WWw.BdX3.cN/pdds/31395.html
WWw.BdX3.cN/pdds/31396.html
WWw.BdX3.cN/pdds/31397.html
WWw.BdX3.cN/pdds/31398.html
WWw.BdX3.cN/pdds/31399.html
WWw.BdX3.cN/pdds/31400.html
WWw.BdX3.cN/pdds/31401.html
WWw.BdX3.cN/pdds/31402.html
WWw.BdX3.cN/pdds/31403.html
WWw.BdX3.cN/pdds/31404.html
WWw.BdX3.cN/pdds/31405.html
WWw.BdX3.cN/pdds/31406.html
WWw.BdX3.cN/pdds/31407.html
WWw.BdX3.cN/pdds/31408.html
WWw.BdX3.cN/pdds/31409.html
WWw.BdX3.cN/pdds/31410.html
WWw.BdX3.cN/pdds/31411.html
WWw.BdX3.cN/pdds/31412.html
WWw.BdX3.cN/pdds/31413.html
WWw.BdX3.cN/pdds/31414.html
WWw.BdX3.cN/pdds/31415.html
WWw.BdX3.cN/pdds/31416.html
WWw.BdX3.cN/pdds/31417.html
WWw.BdX3.cN/pdds/31418.html
WWw.BdX3.cN/pdds/31419.html
WWw.BdX3.cN/pdds/31420.html
WWw.BdX3.cN/pdds/31421.html
WWw.BdX3.cN/pdds/31422.html
WWw.BdX3.cN/pdds/31423.html
WWw.BdX3.cN/pdds/31424.html
WWw.BdX3.cN/pdds/31425.html
WWw.BdX3.cN/pdds/31426.html
WWw.BdX3.cN/pdds/31427.html
WWw.BdX3.cN/pdds/31428.html
WWw.BdX3.cN/pdds/31429.html
WWw.BdX3.cN/pdds/31430.html
WWw.BdX3.cN/pdds/31431.html
WWw.BdX3.cN/pdds/31432.html
WWw.BdX3.cN/pdds/31433.html
WWw.BdX3.cN/pdds/31434.html
WWw.BdX3.cN/pdds/31435.html
WWw.BdX3.cN/pdds/31436.html
WWw.BdX3.cN/pdds/31437.html
WWw.BdX3.cN/pdds/31438.html
WWw.BdX3.cN/pdds/31439.html
WWw.BdX3.cN/pdds/31440.html
WWw.BdX3.cN/pdds/31441.html
WWw.BdX3.cN/pdds/31442.html
WWw.BdX3.cN/pdds/31443.html
WWw.BdX3.cN/pdds/31444.html
WWw.BdX3.cN/pdds/31445.html
WWw.BdX3.cN/pdds/31446.html
WWw.BdX3.cN/pdds/31447.html
WWw.BdX3.cN/pdds/31448.html
WWw.BdX3.cN/pdds/31449.html
WWw.BdX3.cN/pdds/31450.html
WWw.BdX3.cN/pdds/31451.html
WWw.BdX3.cN/pdds/31452.html
WWw.BdX3.cN/pdds/31453.html
WWw.BdX3.cN/pdds/31454.html
WWw.BdX3.cN/pdds/31455.html
WWw.BdX3.cN/pdds/31456.html
WWw.BdX3.cN/pdds/31457.html
WWw.BdX3.cN/pdds/31458.html
WWw.BdX3.cN/pdds/31459.html
WWw.BdX3.cN/pdds/31460.html
WWw.BdX3.cN/pdds/31461.html
WWw.BdX3.cN/pdds/31462.html
WWw.BdX3.cN/pdds/31463.html
WWw.BdX3.cN/pdds/31464.html
WWw.BdX3.cN/pdds/31465.html
WWw.BdX3.cN/pdds/31466.html
WWw.BdX3.cN/pdds/31467.html
WWw.BdX3.cN/pdds/31468.html
WWw.BdX3.cN/pdds/31469.html
WWw.BdX3.cN/pdds/31470.html
WWw.BdX3.cN/pdds/31471.html
WWw.BdX3.cN/pdds/31472.html
WWw.BdX3.cN/pdds/31473.html
WWw.BdX3.cN/pdds/31474.html
WWw.BdX3.cN/pdds/31475.html
WWw.BdX3.cN/pdds/31476.html
WWw.BdX3.cN/pdds/31477.html
WWw.BdX3.cN/pdds/31478.html
WWw.BdX3.cN/pdds/31479.html
WWw.BdX3.cN/pdds/31480.html
WWw.BdX3.cN/pdds/31481.html
WWw.BdX3.cN/pdds/31482.html
WWw.BdX3.cN/pdds/31483.html
WWw.BdX3.cN/pdds/31484.html
WWw.BdX3.cN/pdds/31485.html
WWw.BdX3.cN/pdds/31486.html
http://WWw.BdX3.cN/pds/
WWw.BdX3.cN/pdds/31487.html
WWw.BdX3.cN/pdds/31488.html
WWw.BdX3.cN/pdds/31489.html
WWw.BdX3.cN/pdds/31490.html
WWw.BdX3.cN/pdds/31491.html
WWw.BdX3.cN/pdds/31492.html
WWw.BdX3.cN/pdds/31493.html
WWw.BdX3.cN/pdds/31494.html
WWw.BdX3.cN/pdds/31495.html
WWw.BdX3.cN/pdds/31496.html
WWw.BdX3.cN/pdds/31497.html
WWw.BdX3.cN/pdds/31498.html
WWw.BdX3.cN/pdds/31499.html
WWw.BdX3.cN/pdds/31500.html
WWw.BdX3.cN/pdds/31501.html
WWw.BdX3.cN/pdds/31502.html
WWw.BdX3.cN/pdds/31503.html
WWw.BdX3.cN/pdds/31504.html
WWw.BdX3.cN/pdds/31505.html
WWw.BdX3.cN/pdds/31506.html
WWw.BdX3.cN/pdds/31507.html
WWw.BdX3.cN/pdds/31508.html
WWw.BdX3.cN/pdds/31509.html
WWw.BdX3.cN/pdds/31510.html
WWw.BdX3.cN/pdds/31511.html
WWw.BdX3.cN/pdds/31512.html
WWw.BdX3.cN/pdds/31513.html
WWw.BdX3.cN/pdds/31514.html
WWw.BdX3.cN/pdds/31515.html
WWw.BdX3.cN/pdds/31516.html
WWw.BdX3.cN/pdds/31517.html
WWw.BdX3.cN/pdds/31518.html
WWw.BdX3.cN/pdds/31519.html
WWw.BdX3.cN/pdds/31520.html
WWw.BdX3.cN/pdds/31521.html
WWw.BdX3.cN/pdds/31522.html
WWw.BdX3.cN/pdds/31523.html
WWw.BdX3.cN/pdds/31524.html
WWw.BdX3.cN/pdds/31525.html
WWw.BdX3.cN/pdds/31526.html
WWw.BdX3.cN/pdds/31527.html
WWw.BdX3.cN/pdds/31528.html
WWw.BdX3.cN/pdds/31529.html
WWw.BdX3.cN/pdds/31530.html
WWw.BdX3.cN/pdds/31531.html
WWw.BdX3.cN/pdds/31532.html
WWw.BdX3.cN/pdds/31533.html
WWw.BdX3.cN/pdds/31534.html
WWw.BdX3.cN/pdds/31535.html
WWw.BdX3.cN/pdds/31536.html
WWw.BdX3.cN/pdds/31537.html
WWw.BdX3.cN/pdds/31538.html
WWw.BdX3.cN/pdds/31539.html
WWw.BdX3.cN/pdds/31540.html
WWw.BdX3.cN/pdds/31541.html
WWw.BdX3.cN/pdds/31542.html
WWw.BdX3.cN/pdds/31543.html
WWw.BdX3.cN/pdds/31544.html
WWw.BdX3.cN/pdds/31545.html
WWw.BdX3.cN/pdds/31546.html
WWw.BdX3.cN/pdds/31547.html
WWw.BdX3.cN/pdds/31548.html
WWw.BdX3.cN/pdds/31549.html
WWw.BdX3.cN/pdds/31550.html
WWw.BdX3.cN/pdds/31551.html
WWw.BdX3.cN/pdds/31552.html
WWw.BdX3.cN/pdds/31553.html
WWw.BdX3.cN/pdds/31554.html
WWw.BdX3.cN/pdds/31555.html
WWw.BdX3.cN/pdds/31556.html
WWw.BdX3.cN/pdds/31557.html
WWw.BdX3.cN/pdds/31558.html
WWw.BdX3.cN/pdds/31559.html
WWw.BdX3.cN/pdds/31560.html
WWw.BdX3.cN/pdds/31561.html
WWw.BdX3.cN/pdds/31562.html
WWw.BdX3.cN/pdds/31563.html
WWw.BdX3.cN/pdds/31564.html
WWw.BdX3.cN/pdds/31565.html
WWw.BdX3.cN/pdds/31566.html
WWw.BdX3.cN/pdds/31567.html
WWw.BdX3.cN/pdds/31568.html
WWw.BdX3.cN/pdds/31569.html