开发者一直困惑的多线程机制是, 明明开启了多线程, 处理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, n1): 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(targettask1) t2 threading.Thread(targettask2) 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, n1): total i return total # 多进程实现真正利用多核CPU def multi_process(): start_time time.time() # 创建两个进程分两段计算 p1 multiprocessing.Process(targetcalculate_sum, args(5000000,)) p2 multiprocessing.Process(targetcalculate_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.htmlWWw.BdX3.cN/pdds/31246.htmlWWw.BdX3.cN/pdds/31247.htmlWWw.BdX3.cN/pdds/31248.htmlWWw.BdX3.cN/pdds/31249.htmlWWw.BdX3.cN/pdds/31250.htmlWWw.BdX3.cN/pdds/31251.htmlWWw.BdX3.cN/pdds/31252.htmlWWw.BdX3.cN/pdds/31253.htmlWWw.BdX3.cN/pdds/31254.htmlWWw.BdX3.cN/pdds/31255.htmlWWw.BdX3.cN/pdds/31256.htmlWWw.BdX3.cN/pdds/31257.htmlWWw.BdX3.cN/pdds/31258.htmlWWw.BdX3.cN/pdds/31259.htmlWWw.BdX3.cN/pdds/31260.htmlWWw.BdX3.cN/pdds/31261.htmlWWw.BdX3.cN/pdds/31262.htmlWWw.BdX3.cN/pdds/31263.htmlWWw.BdX3.cN/pdds/31264.htmlWWw.BdX3.cN/pdds/31265.htmlWWw.BdX3.cN/pdds/31266.htmlWWw.BdX3.cN/pdds/31267.htmlWWw.BdX3.cN/pdds/31268.htmlWWw.BdX3.cN/pdds/31269.htmlWWw.BdX3.cN/pdds/31270.htmlWWw.BdX3.cN/pdds/31271.htmlWWw.BdX3.cN/pdds/31272.htmlWWw.BdX3.cN/pdds/31273.htmlWWw.BdX3.cN/pdds/31274.htmlWWw.BdX3.cN/pdds/31275.htmlWWw.BdX3.cN/pdds/31276.htmlWWw.BdX3.cN/pdds/31277.htmlWWw.BdX3.cN/pdds/31278.htmlWWw.BdX3.cN/pdds/31279.htmlWWw.BdX3.cN/pdds/31280.htmlWWw.BdX3.cN/pdds/31281.htmlWWw.BdX3.cN/pdds/31282.htmlWWw.BdX3.cN/pdds/31283.htmlWWw.BdX3.cN/pdds/31284.htmlWWw.BdX3.cN/pdds/31285.htmlWWw.BdX3.cN/pdds/31286.htmlWWw.BdX3.cN/pdds/31287.htmlWWw.BdX3.cN/pdds/31288.htmlWWw.BdX3.cN/pdds/31289.htmlWWw.BdX3.cN/pdds/31290.htmlWWw.BdX3.cN/pdds/31291.htmlWWw.BdX3.cN/pdds/31292.htmlWWw.BdX3.cN/pdds/31293.htmlWWw.BdX3.cN/pdds/31294.htmlWWw.BdX3.cN/pdds/31295.htmlWWw.BdX3.cN/pdds/31296.htmlWWw.BdX3.cN/pdds/31297.htmlWWw.BdX3.cN/pdds/31298.htmlWWw.BdX3.cN/pdds/31299.htmlWWw.BdX3.cN/pdds/31300.htmlWWw.BdX3.cN/pdds/31301.htmlWWw.BdX3.cN/pdds/31302.htmlWWw.BdX3.cN/pdds/31303.htmlWWw.BdX3.cN/pdds/31304.htmlWWw.BdX3.cN/pdds/31305.htmlWWw.BdX3.cN/pdds/31306.htmlWWw.BdX3.cN/pdds/31307.htmlWWw.BdX3.cN/pdds/31308.htmlWWw.BdX3.cN/pdds/31309.htmlWWw.BdX3.cN/pdds/31310.htmlWWw.BdX3.cN/pdds/31311.htmlWWw.BdX3.cN/pdds/31312.htmlWWw.BdX3.cN/pdds/31313.htmlWWw.BdX3.cN/pdds/31314.htmlWWw.BdX3.cN/pdds/31315.htmlWWw.BdX3.cN/pdds/31316.htmlWWw.BdX3.cN/pdds/31317.htmlWWw.BdX3.cN/pdds/31318.htmlWWw.BdX3.cN/pdds/31319.htmlWWw.BdX3.cN/pdds/31320.htmlWWw.BdX3.cN/pdds/31321.htmlWWw.BdX3.cN/pdds/31322.htmlWWw.BdX3.cN/pdds/31323.htmlWWw.BdX3.cN/pdds/31324.htmlWWw.BdX3.cN/pdds/31325.htmlWWw.BdX3.cN/pdds/31326.htmlWWw.BdX3.cN/pdds/31327.htmlWWw.BdX3.cN/pdds/31328.htmlWWw.BdX3.cN/pdds/31329.htmlWWw.BdX3.cN/pdds/31330.htmlWWw.BdX3.cN/pdds/31331.htmlWWw.BdX3.cN/pdds/31332.htmlWWw.BdX3.cN/pdds/31333.htmlWWw.BdX3.cN/pdds/31334.htmlWWw.BdX3.cN/pdds/31335.htmlWWw.BdX3.cN/pdds/31336.htmlWWw.BdX3.cN/pdds/31337.htmlWWw.BdX3.cN/pdds/31338.htmlWWw.BdX3.cN/pdds/31339.htmlWWw.BdX3.cN/pdds/31340.htmlWWw.BdX3.cN/pdds/31341.htmlWWw.BdX3.cN/pdds/31342.htmlWWw.BdX3.cN/pdds/31343.htmlWWw.BdX3.cN/pdds/31344.htmlWWw.BdX3.cN/pdds/31345.htmlWWw.BdX3.cN/pdds/31346.htmlWWw.BdX3.cN/pdds/31347.htmlWWw.BdX3.cN/pdds/31348.htmlWWw.BdX3.cN/pdds/31349.htmlWWw.BdX3.cN/pdds/31350.htmlWWw.BdX3.cN/pdds/31351.htmlWWw.BdX3.cN/pdds/31352.htmlWWw.BdX3.cN/pdds/31353.htmlWWw.BdX3.cN/pdds/31354.htmlWWw.BdX3.cN/pdds/31355.htmlWWw.BdX3.cN/pdds/31356.htmlWWw.BdX3.cN/pdds/31357.htmlWWw.BdX3.cN/pdds/31358.htmlWWw.BdX3.cN/pdds/31359.htmlWWw.BdX3.cN/pdds/31360.htmlWWw.BdX3.cN/pdds/31361.htmlWWw.BdX3.cN/pdds/31362.htmlWWw.BdX3.cN/pdds/31363.htmlWWw.BdX3.cN/pdds/31364.htmlWWw.BdX3.cN/pdds/31365.htmlWWw.BdX3.cN/pdds/31366.htmlWWw.BdX3.cN/pdds/31367.htmlWWw.BdX3.cN/pdds/31368.htmlWWw.BdX3.cN/pdds/31369.htmlWWw.BdX3.cN/pdds/31370.htmlWWw.BdX3.cN/pdds/31371.htmlWWw.BdX3.cN/pdds/31372.htmlWWw.BdX3.cN/pdds/31373.htmlWWw.BdX3.cN/pdds/31374.htmlWWw.BdX3.cN/pdds/31375.htmlWWw.BdX3.cN/pdds/31376.htmlWWw.BdX3.cN/pdds/31377.htmlWWw.BdX3.cN/pdds/31378.htmlWWw.BdX3.cN/pdds/31379.htmlWWw.BdX3.cN/pdds/31380.htmlWWw.BdX3.cN/pdds/31381.htmlWWw.BdX3.cN/pdds/31382.htmlWWw.BdX3.cN/pdds/31383.htmlWWw.BdX3.cN/pdds/31384.htmlWWw.BdX3.cN/pdds/31385.htmlWWw.BdX3.cN/pdds/31386.htmlWWw.BdX3.cN/pdds/31387.htmlWWw.BdX3.cN/pdds/31388.htmlWWw.BdX3.cN/pdds/31389.htmlWWw.BdX3.cN/pdds/31390.htmlWWw.BdX3.cN/pdds/31391.htmlWWw.BdX3.cN/pdds/31392.htmlWWw.BdX3.cN/pdds/31393.htmlWWw.BdX3.cN/pdds/31394.htmlWWw.BdX3.cN/pdds/31395.htmlWWw.BdX3.cN/pdds/31396.htmlWWw.BdX3.cN/pdds/31397.htmlWWw.BdX3.cN/pdds/31398.htmlWWw.BdX3.cN/pdds/31399.htmlWWw.BdX3.cN/pdds/31400.htmlWWw.BdX3.cN/pdds/31401.htmlWWw.BdX3.cN/pdds/31402.htmlWWw.BdX3.cN/pdds/31403.htmlWWw.BdX3.cN/pdds/31404.htmlWWw.BdX3.cN/pdds/31405.htmlWWw.BdX3.cN/pdds/31406.htmlWWw.BdX3.cN/pdds/31407.htmlWWw.BdX3.cN/pdds/31408.htmlWWw.BdX3.cN/pdds/31409.htmlWWw.BdX3.cN/pdds/31410.htmlWWw.BdX3.cN/pdds/31411.htmlWWw.BdX3.cN/pdds/31412.htmlWWw.BdX3.cN/pdds/31413.htmlWWw.BdX3.cN/pdds/31414.htmlWWw.BdX3.cN/pdds/31415.htmlWWw.BdX3.cN/pdds/31416.htmlWWw.BdX3.cN/pdds/31417.htmlWWw.BdX3.cN/pdds/31418.htmlWWw.BdX3.cN/pdds/31419.htmlWWw.BdX3.cN/pdds/31420.htmlWWw.BdX3.cN/pdds/31421.htmlWWw.BdX3.cN/pdds/31422.htmlWWw.BdX3.cN/pdds/31423.htmlWWw.BdX3.cN/pdds/31424.htmlWWw.BdX3.cN/pdds/31425.htmlWWw.BdX3.cN/pdds/31426.htmlWWw.BdX3.cN/pdds/31427.htmlWWw.BdX3.cN/pdds/31428.htmlWWw.BdX3.cN/pdds/31429.htmlWWw.BdX3.cN/pdds/31430.htmlWWw.BdX3.cN/pdds/31431.htmlWWw.BdX3.cN/pdds/31432.htmlWWw.BdX3.cN/pdds/31433.htmlWWw.BdX3.cN/pdds/31434.htmlWWw.BdX3.cN/pdds/31435.htmlWWw.BdX3.cN/pdds/31436.htmlWWw.BdX3.cN/pdds/31437.htmlWWw.BdX3.cN/pdds/31438.htmlWWw.BdX3.cN/pdds/31439.htmlWWw.BdX3.cN/pdds/31440.htmlWWw.BdX3.cN/pdds/31441.htmlWWw.BdX3.cN/pdds/31442.htmlWWw.BdX3.cN/pdds/31443.htmlWWw.BdX3.cN/pdds/31444.htmlWWw.BdX3.cN/pdds/31445.htmlWWw.BdX3.cN/pdds/31446.htmlWWw.BdX3.cN/pdds/31447.htmlWWw.BdX3.cN/pdds/31448.htmlWWw.BdX3.cN/pdds/31449.htmlWWw.BdX3.cN/pdds/31450.htmlWWw.BdX3.cN/pdds/31451.htmlWWw.BdX3.cN/pdds/31452.htmlWWw.BdX3.cN/pdds/31453.htmlWWw.BdX3.cN/pdds/31454.htmlWWw.BdX3.cN/pdds/31455.htmlWWw.BdX3.cN/pdds/31456.htmlWWw.BdX3.cN/pdds/31457.htmlWWw.BdX3.cN/pdds/31458.htmlWWw.BdX3.cN/pdds/31459.htmlWWw.BdX3.cN/pdds/31460.htmlWWw.BdX3.cN/pdds/31461.htmlWWw.BdX3.cN/pdds/31462.htmlWWw.BdX3.cN/pdds/31463.htmlWWw.BdX3.cN/pdds/31464.htmlWWw.BdX3.cN/pdds/31465.htmlWWw.BdX3.cN/pdds/31466.htmlWWw.BdX3.cN/pdds/31467.htmlWWw.BdX3.cN/pdds/31468.htmlWWw.BdX3.cN/pdds/31469.htmlWWw.BdX3.cN/pdds/31470.htmlWWw.BdX3.cN/pdds/31471.htmlWWw.BdX3.cN/pdds/31472.htmlWWw.BdX3.cN/pdds/31473.htmlWWw.BdX3.cN/pdds/31474.htmlWWw.BdX3.cN/pdds/31475.htmlWWw.BdX3.cN/pdds/31476.htmlWWw.BdX3.cN/pdds/31477.htmlWWw.BdX3.cN/pdds/31478.htmlWWw.BdX3.cN/pdds/31479.htmlWWw.BdX3.cN/pdds/31480.htmlWWw.BdX3.cN/pdds/31481.htmlWWw.BdX3.cN/pdds/31482.htmlWWw.BdX3.cN/pdds/31483.htmlWWw.BdX3.cN/pdds/31484.htmlWWw.BdX3.cN/pdds/31485.htmlWWw.BdX3.cN/pdds/31486.htmlhttp://WWw.BdX3.cN/pds/WWw.BdX3.cN/pdds/31487.htmlWWw.BdX3.cN/pdds/31488.htmlWWw.BdX3.cN/pdds/31489.htmlWWw.BdX3.cN/pdds/31490.htmlWWw.BdX3.cN/pdds/31491.htmlWWw.BdX3.cN/pdds/31492.htmlWWw.BdX3.cN/pdds/31493.htmlWWw.BdX3.cN/pdds/31494.htmlWWw.BdX3.cN/pdds/31495.htmlWWw.BdX3.cN/pdds/31496.htmlWWw.BdX3.cN/pdds/31497.htmlWWw.BdX3.cN/pdds/31498.htmlWWw.BdX3.cN/pdds/31499.htmlWWw.BdX3.cN/pdds/31500.htmlWWw.BdX3.cN/pdds/31501.htmlWWw.BdX3.cN/pdds/31502.htmlWWw.BdX3.cN/pdds/31503.htmlWWw.BdX3.cN/pdds/31504.htmlWWw.BdX3.cN/pdds/31505.htmlWWw.BdX3.cN/pdds/31506.htmlWWw.BdX3.cN/pdds/31507.htmlWWw.BdX3.cN/pdds/31508.htmlWWw.BdX3.cN/pdds/31509.htmlWWw.BdX3.cN/pdds/31510.htmlWWw.BdX3.cN/pdds/31511.htmlWWw.BdX3.cN/pdds/31512.htmlWWw.BdX3.cN/pdds/31513.htmlWWw.BdX3.cN/pdds/31514.htmlWWw.BdX3.cN/pdds/31515.htmlWWw.BdX3.cN/pdds/31516.htmlWWw.BdX3.cN/pdds/31517.htmlWWw.BdX3.cN/pdds/31518.htmlWWw.BdX3.cN/pdds/31519.htmlWWw.BdX3.cN/pdds/31520.htmlWWw.BdX3.cN/pdds/31521.htmlWWw.BdX3.cN/pdds/31522.htmlWWw.BdX3.cN/pdds/31523.htmlWWw.BdX3.cN/pdds/31524.htmlWWw.BdX3.cN/pdds/31525.htmlWWw.BdX3.cN/pdds/31526.htmlWWw.BdX3.cN/pdds/31527.htmlWWw.BdX3.cN/pdds/31528.htmlWWw.BdX3.cN/pdds/31529.htmlWWw.BdX3.cN/pdds/31530.htmlWWw.BdX3.cN/pdds/31531.htmlWWw.BdX3.cN/pdds/31532.htmlWWw.BdX3.cN/pdds/31533.htmlWWw.BdX3.cN/pdds/31534.htmlWWw.BdX3.cN/pdds/31535.htmlWWw.BdX3.cN/pdds/31536.htmlWWw.BdX3.cN/pdds/31537.htmlWWw.BdX3.cN/pdds/31538.htmlWWw.BdX3.cN/pdds/31539.htmlWWw.BdX3.cN/pdds/31540.htmlWWw.BdX3.cN/pdds/31541.htmlWWw.BdX3.cN/pdds/31542.htmlWWw.BdX3.cN/pdds/31543.htmlWWw.BdX3.cN/pdds/31544.htmlWWw.BdX3.cN/pdds/31545.htmlWWw.BdX3.cN/pdds/31546.htmlWWw.BdX3.cN/pdds/31547.htmlWWw.BdX3.cN/pdds/31548.htmlWWw.BdX3.cN/pdds/31549.htmlWWw.BdX3.cN/pdds/31550.htmlWWw.BdX3.cN/pdds/31551.htmlWWw.BdX3.cN/pdds/31552.htmlWWw.BdX3.cN/pdds/31553.htmlWWw.BdX3.cN/pdds/31554.htmlWWw.BdX3.cN/pdds/31555.htmlWWw.BdX3.cN/pdds/31556.htmlWWw.BdX3.cN/pdds/31557.htmlWWw.BdX3.cN/pdds/31558.htmlWWw.BdX3.cN/pdds/31559.htmlWWw.BdX3.cN/pdds/31560.htmlWWw.BdX3.cN/pdds/31561.htmlWWw.BdX3.cN/pdds/31562.htmlWWw.BdX3.cN/pdds/31563.htmlWWw.BdX3.cN/pdds/31564.htmlWWw.BdX3.cN/pdds/31565.htmlWWw.BdX3.cN/pdds/31566.htmlWWw.BdX3.cN/pdds/31567.htmlWWw.BdX3.cN/pdds/31568.htmlWWw.BdX3.cN/pdds/31569.html
网站建设
高端定制
企业官网