目 录CONTENT

文章目录

Python 3.14 中的子解释器 (Subinterpreters)

Administrator
2025-10-11 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

 

字数 1356,阅读大约需 7 分钟

Python 3.14 中的子解释器 (Subinterpreters)

GIL限制线程

子解释器

核心:同一个进程多个子解释器,每个子解释器单独GIL

特性

子解释器

多线程

多进程

并行执行

✅ 并行(配合线程)

❌ 受 GIL 限制

✅ 真正并行

内存开销

🟡 中等

🟢 低

🔴 高

启动速度

🟢 快

🟢 快

🟡 慢

状态隔离

✅ 完全隔离

❌ 共享状态

✅ 完全隔离

通信开销

🟡 中等

🟢 低

🔴 高

什么是解释器和子解释器?

阅读:Python 3.14 有什么新变化 — Python 3.14.0 文档[1]
PEP 734 – 标准库中的多个解释器 | peps.python.org - Python 增强提案[2]

解释器 (Interpreter)

解释器是 Python 运行时环境的完整实例,包含:

  • • 全局变量和模块的命名空间

  • • 导入的模块缓存

  • • 内置函数和类型

  • • 执行状态和配置

通常我们运行 Python 程序时,使用的就是主解释器 (main interpreter)。

子解释器 (Subinterpreter)

子解释器是在同一个 Python 进程中创建的独立解释器实例。每个子解释器都有:

  • • 自己独立的全局命名空间

  • • 自己的模块导入缓存

  • • 独立的全局变量

  • • 但共享底层的 C 扩展和某些资源

备注

官方原文:从技术上讲,同一进程中的解释器永远无法实现严格隔离,因为在同一进程内对内存访问几乎没有任何限制。Python 运行时会尽力确保隔离性,但扩展模块很容易破坏这种隔离。因此,在安全敏感场景下——当不同解释器之间本不应相互访问数据时——请勿使用多解释器模式。
concurrent.interpreters 模块提供了一套基础API,用于创建和管理解释器,以及执行这种"切换-调用"操作。

Python 3.14 的 concurrent.interpreters 模块

Python 3.14 引入了 concurrent.interpreters 模块(之前是 _interpreters 私有模块),使得子解释器功能更加成熟和易用。这个模块允许:

  1. 1. 真正的并行执行:不受 GIL (Global Interpreter Lock) 限制

  2. 2. 隔离性:每个子解释器有独立的状态

  3. 3. 安全性:子解释器之间不会互相干扰

核心概念

  • 真正的并行:与多线程不同,子解释器各自拥有独立的 GIL,可以真正并行执行 Python 代码

  • 隔离性:一个子解释器的崩溃不会影响其他子解释器

  • 通信:通过通道 (channels) 进行数据交换

子解释器 vs 其他并发方式

特性

子解释器

多线程

多进程

并行执行

✅ 真正并行

❌ 受 GIL 限制

✅ 真正并行

内存开销

🟡 中等

🟢 低

🔴 高

启动速度

🟢 快

🟢 快

🟡 慢

状态隔离

✅ 完全隔离

❌ 共享状态

✅ 完全隔离

通信开销

🟡 中等

🟢 低

🔴 高

适用场景

子解释器最适合:

  • • CPU 密集型任务需要并行处理

  • • 需要隔离的执行环境(如插件系统)

  • • 在同一进程中运行不信任的代码

  • • 需要比多进程更轻量但比多线程更好并行性的场景

不适合:

  • • I/O 密集型任务(用 asyncio 更好)

  • • 需要共享大量数据的场景(通信成本高)

  • • 简单的并发需求(多线程足够)

注意:concurrent.interpreters 在 Python 3.14 中仍在不断完善,某些功能可能还在实验阶段。建议查看最新的官方文档了解最新进展。

代码


    
    
    
  from concurrent import interpreters
import time
import threading
from datetime import datetime

def format_timestamp(timestamp):
    """将Unix时间戳格式化为可读的日期时间字符串"""
    return datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]


def _run_interp_code(interp, code, interp_id, results):
    """在子解释器中执行代码并记录时间"""
    start_interp_time = time.time()
    interp.exec(code)
    end_interp_time = time.time()
    duration = end_interp_time - start_interp_time
    print(f"子解释器 {interp_id}: 启动时间 {format_timestamp(start_interp_time)}, 结束时间 {format_timestamp(end_interp_time)}, 总用时 {duration:.3f}秒")
    results[interp_id] = duration

def create_and_prepare_interp(interp_id):
    """创建子解释器并准备执行代码"""
    interp = interpreters.create()
    code = f"""
import time
import random
from datetime import datetime

def format_timestamp_internal(timestamp):
    # 将Unix时间戳格式化为可读的日期时间字符串
    return datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]

def heavy_computation():
    # 模拟CPU密集型任务
    result = 0
    for i in range(10**6):
        result += i * i
    time.sleep(5)
    return result

# 子解释器内部记录任务开始时间
task_start_time = time.time()
result = heavy_computation()
# 子解释器内部记录任务结束时间
task_end_time = time.time()
execution_time = task_end_time - task_start_time
# print(f"子解释器 {interp_id}: 任务开始时间 {{format_timestamp_internal(task_start_time)}}, 任务结束时间 {{format_timestamp_internal(task_end_time)}}, 计算结果 {{result}}, 耗时 {{execution_time:.3f}}秒")
"""
    return interp, code


print("=== 子解释器并行计算演示 ===")
start_time = time.time()

# 创建多个子解释器并行执行
threads = []
results = {} # 用于收集每个子解释器的执行时间
for i in range(4):
    interp, code = create_and_prepare_interp(i)
    thread = threading.Thread(target=_run_interp_code, args=(interp, code, i, results))
    threads.append(thread)
    thread.start()

# 等待所有线程完成
for thread in threads:
    thread.join()

total_time = time.time() - start_time
print(f"总执行时间: {total_time:.3f}秒")

    
    
    
  === 子解释器并行计算演示 ===
子解释器 0: 启动时间 2025-10-11 12:50:32.519, 结束时间 2025-10-11 12:50:37.544, 总用时 5.026秒
子解释器 1: 启动时间 2025-10-11 12:50:32.542, 结束时间 2025-10-11 12:50:37.567, 总用时 5.025秒
子解释器 2: 启动时间 2025-10-11 12:50:32.566, 结束时间 2025-10-11 12:50:37.587, 总用时 5.021秒
子解释器 3: 启动时间 2025-10-11 12:50:32.588, 结束时间 2025-10-11 12:50:37.613, 总用时 5.025秒
总执行时间: 5.121秒

引用链接

[1] 阅读:Python 3.14 有什么新变化 — Python 3.14.0 文档: https://docs.python.org/zh-cn/3.14/whatsnew/3.14.html
[2] PEP 734 – 标准库中的多个解释器 | peps.python.org - Python 增强提案: https://peps.pythonlang.cn/pep-0734/

 

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区