多年以来由于全局解释器锁(GIL)的存在,导致 Python 生态一直就没有真正的多线程,也就是说所有线程都运行在同一个核心上,不管你的 CPU 物理上有多少个核心它只用一个。那场面真的是一核有难 8 核围观。
随着 Python 之父的回归,Python 也是越来越看重性能;GIL 这个老大难问题也提上了日程。从最近的讨论我们可以看到 GIL 在 Python-3.12 之后将会是一个可选项。详细的可以看官方的 PEP 703 提案。
GIL 面对 CPU 密集型场景是真的坑
记得刚开始搞 Python 量化投资的时候,逻辑还比较简单整个模型都是自己手撸,也没有用什么第三方库;那时刚入门的我就发现一个问题;我的程序好像只能用到一个核的算力。
后来才知道是 GIL 坑的我,大意了!凡是过往、皆为序章,就此打住。先来构造一个简单的 CPU 密集型场景,体验一下 GIL 有多坑。
#!/usr/bin/env python3
# -*- encoding: utf8 -*-
"""
测试多线程下 CPU 密集型场景 GIL 的性能表现
"""
from concurrent.futures import ThreadPoolExecutor
def fun_sum(max_number:int = 0):
"""从 0 累加到 max_number -1
Parameter:
----------
max_number: int
Return:
-------
int
"""
if max_number