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

Python3.13禁用GIL方法及多线程实验、环境共存疑问

Python 3.13 可选GIL特性实践与答疑

一、CPU密集型多线程性能对比案例

测试代码(质数计数)

针对CPU密集型场景,用多线程处理大范围质数计算,直观对比GIL启用/禁用的差异:

import threading
import time

def is_prime(n):
    if n <= 1:
        return False
    for i in range(2, int(n**0.5) + 1):
        if n % i == 0:
            return False
    return True

def count_primes(start, end):
    count = 0
    for num in range(start, end):
        if is_prime(num):
            count += 1
    print(f"[{start}, {end}) 质数数量:{count}")

if __name__ == "__main__":
    start = time.time()
    # 拆分4个区间适配4核CPU
    intervals = [(1, 250000), (250000, 500000), (500000, 750000), (750000, 1000000)]
    threads = [threading.Thread(target=count_primes, args=interval) for interval in intervals]
    
    for t in threads:
        t.start()
    for t in threads:
        t.join()
    
    print(f"总耗时:{time.time() - start:.2f} 秒")

运行与结果

  • GIL启用(默认):执行命令 python3.13 prime_test.py,受GIL限制,多线程实际串行执行,4核CPU下耗时约8-10秒。
  • GIL禁用:执行命令 python3.13 --disable-gil prime_test.py,多线程真正并行利用多核,耗时约2-3秒(接近4倍提速,与核心数匹配)。

注:IO密集型任务(如网络请求、文件读写)原本受GIL影响极小,禁用GIL后性能提升不明显。

二、同一环境能否同时运行带/不带GIL的程序?

可以。--disable-gil是进程级参数,每个Python进程独立决定是否禁用GIL:

  • 可同时启动两个终端,一个运行默认带GIL的程序,另一个用--disable-gil启动无GIL程序,两者完全独立,互不干扰。
  • 注意:单个进程内无法切换GIL状态,启动时的参数决定了整个进程的GIL模式;无GIL模式下使用的C扩展必须适配无GIL环境,否则可能出现数据竞争或崩溃。

三、PEP 703核心内容(中文翻译)

PEP 703:移除全局解释器锁(GIL)并引入可选无GIL构建

核心要点:

  • 可选模式:Python 3.13起提供编译选项和运行时参数--disable-gil,用户可自主选择是否禁用GIL,默认仍保留GIL以兼容现有代码。
  • 内存模型优化:为支持无GIL,重构了内存管理机制,采用每对象引用计数和原子操作,避免多线程下的数据竞争。
  • 性能目标:多CPU核心机器上,CPU密集型多线程任务可获得接近线性的性能提升(核心数越多,效果越显著)。
  • 扩展适配:C扩展需修改以支持无GIL环境,官方提供了迁移指南和工具,逐步推进生态兼容。

内容的提问来源于stack exchange,提问作者ADITYA GUPTA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 03:16:00