Python 3.13 free-threaded 模式的落地评估

冷炫風刃

冷炫風刃

2026-02-18

256人浏览

原创

python 3.13 free-threaded 模式下 asyncio 默认不可用,需显式启用 -x use_free_threading 或改用 uvloop;subprocess timeout 易失效,应手动管理进程;numpy 等扩展需确认线程安全;部署时须在代码中运行时检测 sys.free_threading_enabled。

python 3.13 free-threaded 模式的落地评估

free-threaded 构建后 import asyncio 直接报错怎么办

Python 3.13 的 free-threaded 模式(即 --without-pymalloc + --with-free-threading)默认禁用 GIL,但标准库里不少模块仍隐式依赖 GIL,asyncio 就是典型——它底层的 selectepoll 等系统调用在无 GIL 下可能触发线程竞态,导致初始化失败,错误信息通常是:RuntimeError: asyncio event loop requires the GIL 或更隐蔽的 AttributeError: '_UnixSelectorEventLoop' object has no attribute '_selector'

实操建议:

  • 别直接用系统默认构建的 free-threaded Python 运行 asyncio 项目;目前(3.13.0b2)asyncio 官方明确标注为「实验性支持」,需手动启用:python -X use_free_threading -c "import asyncio"
  • 若必须用 asyncio,优先考虑 uvloop 替代默认事件循环(它对 free-threaded 适配更早),但要注意:uvloop ≥ 0.19.0 才真正通过 PyThreadState_Get() 兼容无 GIL 环境
  • 检查所有第三方异步库是否声明支持 free-threaded —— 比如 aiohttp 3.9+、httpx 0.27+ 有基础适配,但 aiomysqlaioredis 等已归档项目基本不兼容

多线程 CPU 密集任务真能提速?看 threading.Thread + numpy 实测表现

free-threaded 模式的核心价值是让纯 Python 多线程能并行跑 CPU 密集代码,但实际效果高度依赖 C 扩展是否也释放了 GIL。比如 numpy 的多数 ufunc 在 free-threaded 下确实能并发执行,但前提是它用的是 OpenMP 后端且编译时启用了 NPY_ALLOW_THREADS

实操建议:

  • 确认 numpy 版本 ≥ 1.26,并用 np.show_config() 查看是否启用了 OpenMP;若显示 openmp: True,再验证并发性:import threading, numpy as np; [threading.Thread(target=lambda: np.dot(np.random.rand(2000,2000), np.random.rand(2000,2000))).start() for _ in range(4)],观察 CPU 利用率是否接近 400%
  • 避免混用 GIL-aware 和 GIL-free 扩展:比如同时调用 cv2.cvtColor(OpenCV 默认持 GIL)和 np.fft.fft(free-threaded 可并发),前者会阻塞后者线程
  • 注意内存分配器行为变化:free-threaded 构建默认禁用 pymalloc,malloc 分配变慢,小对象频繁创建(如大量 list.append())反而比带 GIL 的版本更卡

subprocess.run 在 free-threaded 下为何更容易卡死或超时

free-threaded 模式下,subprocess 模块的信号处理逻辑没完全适配。典型现象是:子进程未正常退出时,主线程调用 subprocess.run(..., timeout=5) 可能永远阻塞,或抛出 subprocess.TimeoutExpired 但子进程仍在后台运行(僵尸进程)。

Python 3.14.2
Python 3.14.2

Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。

下载

原因在于 subprocess 依赖 PyThreadState 做中断点检查,而 free-threaded 中线程状态切换更松散,siginterrupt()pthread_kill() 的协同失效。

实操建议:

  • 绕过 timeout 参数,改用 subprocess.Popen + threading.Timer 手动 kill:p = subprocess.Popen(...); timer = threading.Timer(5, p.kill); timer.start(); p.wait(); timer.cancel()
  • 关键路径避免用 shell=True —— shell 解析器(如 bash)本身不是线程安全的,在无 GIL 下可能引发竞态死锁
  • 如果必须用 timeout,确保 Python 是从源码用 --with-pydebug 编译的 free-threaded 版本,调试模式下信号中断逻辑更健壮(但性能损失约 15%)

打包部署时 pyproject.toml 怎么声明 free-threaded 兼容性

目前没有标准字段标记「本包支持 free-threaded」,但用户安装时若用错解释器,会在 import 阶段才暴露问题(比如 C 扩展加载失败),排查成本高。

实操建议:

  • pyproject.toml[project.requires-python] 后追加注释说明:# Requires free-threaded Python 3.13+ (built with --with-free-threading),虽然不被 pip 解析,但能提醒 CI/运维
  • setup.pypyproject.toml[project.optional-dependencies] 里设一个 free-threaded 分组,只放已验证兼容的依赖(如 uvloop>=0.19.0),让用户显式选择:pip install mypkg[free-threaded]
  • 最关键的是:在 __init__.py 开头加运行时检测,比如:import sys; assert getattr(sys, 'free_threading_enabled', False), "This package requires free-threaded Python",比文档可靠得多

free-threaded 不是开箱即用的加速开关,它是把「GIL 依赖」从整个生态里一点点抠出来——每个 C 扩展、每条系统调用链、甚至每个 Py_BEGIN_ALLOW_THREADS 宏的位置,都得重新校准。现在最稳的做法,是只在确定无外部依赖的纯计算模块里试水,其它地方先观望。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
pip安装使用方法
pip安装使用方法

安装步骤:1、确保Python已经正确安装在您的计算机上;2、下载“get-pip.py”脚本;3、按下Win + R键,然后输入cmd并按下Enter键来打开命令行窗口;4、在命令行窗口中,使用cd命令切换到“get-pip.py”所在的目录;5、执行安装命令;6、验证安装结果即可。大家可以访问本专题下的文章,了解pip安装使用方法的更多内容。

2023.10.09

1231

5

更新pip版本
更新pip版本

更新pip版本方法有使用pip自身更新、使用操作系统自带的包管理工具、使用python包管理工具、手动安装最新版本。想了解更多相关的内容,请阅读专题下面的文章。

2024.12.20

2418

6

pip设置清华源
pip设置清华源

设置方法:1、打开终端或命令提示符窗口;2、运行“touch ~/.pip/pip.conf”命令创建一个名为pip的配置文件;3、打开pip.conf文件,然后添加“[global];index-url = https://pypi.tuna.tsinghua.edu.cn/simple”内容,这将把pip的镜像源设置为清华大学的镜像源;4、保存并关闭文件即可。

2024.12.23

3060

11

python升级pip
python升级pip

本专题整合了python升级pip相关教程,阅读下面的文章了解更多详细内容。

2025.07.23

1597

16

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.15

462

5

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

2025.11.08

277

7

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

2026.01.05

134

7

C++ Lambda 表达式与函数式编程
C++ Lambda 表达式与函数式编程

深入讲解 C++ Lambda 表达式与函数式编程范式,涵盖 Lambda 基础语法与返回值推导、值捕获与引用捕获的区别与陷阱、初始化捕获(C++14 广义捕获)、泛型 Lambda(auto 参数)、mutable 关键字修改捕获变量、std::function 类型擦除与函数包装、std::bind 参数绑定(及其被 Lambda 替代的趋势)、Lambda 在 STL 算法(sort/transform/for_each/remo

2026.05.06

116

22

Java 函数式接口与 Lambda 进阶技巧
Java 函数式接口与 Lambda 进阶技巧

在 Java Stream 基础之上进一步深入函数式编程,涵盖 @FunctionalInterface 注解与自定义函数式接口设计、四种方法引用(静态/实例/对象/构造器)的使用场景、Lambda 中的 effectively final 变量捕获规则、函数组合(andThen/compose)与柯里化技巧、Comparator 链式比较器构建、CompletableFuture 异步函数式编排、Reactor / RxJava 响应

2026.05.08

141

28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PyCharm官方快速入门指南
PyCharm官方快速入门指南

共0课时 | 0人学习

Python函数定义官方教程
Python函数定义官方教程

共0课时 | 0人学习

Python 3.14.6官方文档
Python 3.14.6官方文档

共0课时 | 0人学习