PEP 703作者给出的一种no-GIL的实现——python3.9的nogil版本

PEP 703的内容是什么,意义又是什么呢?

可以说python的官方接受的no-GIL提议的PEP就是PEP 703给出的,如果GIL帧的从python中移除那么可以说对整个python生态圈将有着跨越性发展的意义。

 

 

====================================================

 

 

PEP 703地址:

https://peps.python.org/pep-0703/

PEP 703 – Making the Global Interpreter Lock Optional in CPython

 

 

在网上找到的一个中文的nogil项目的相关内容:

Python 官方研讨会:彻底移除 GIL 真的可行么?

 

 

 

===========================================================

 

 

 

nogil项目代码地址:

https://github.com/colesbury/nogil

https://hub.docker.com/r/nogil/python-cuda

 

 

为了测试nogil项目的效果,于是手动编译nogil-python3.9,并和新编译的python3.13进行性能对比:

nogil项目的编译命令:

./configure [--prefix=PREFIX] [--enable-optimizations]
make -j
make install

 

 

 

测试代码:

复制代码
import threading
import time
 
def print_time( threadName, delay):
    s = 0

    for i in range(1000000000):
        s+=i

    print(threadName, s)

p1=threading.Thread( target=print_time, args=("Thread-1", 2, ) )
p2=threading.Thread( target=print_time, args=("Thread-2", 4, ) )

a = time.time()
p1.start()
p2.start()

p1.join()
p2.join()
print(time.time()-a)
复制代码

 

 

测试结果:

 

 

 

可以看到nogil项目的多核心多线程确实可以较大程度提高多线程性能。

 

 

 

-----------------------------------------------------

 

 

再使用nogil项目的官方测试代码:

复制代码
import sys
from concurrent.futures import ThreadPoolExecutor

print(f"nogil={getattr(sys.flags, 'nogil', False)}")

def fib(n):
    if n < 2: return 1
    return fib(n-1) + fib(n-2)

threads = 8
if len(sys.argv) > 1:
    threads = int(sys.argv[1])

with ThreadPoolExecutor(max_workers=threads) as executor:
    for _ in range(threads):
        executor.submit(lambda: print(fib(34)))
复制代码

 

 

 

python3.13的表现:

(base) root@75f68d8ff029:~/nogil# time /root/python3.13/bin/python3.13 /tmp/x2.py
nogil=False
9227465
9227465
9227465
9227465
9227465
9227465
9227465
9227465

real    0m5.623s
user    0m5.638s
sys    0m0.004s
(base) root@75f68d8ff029:~/nogil# time /root/python3.13/bin/python3.13 /tmp/x2.py
nogil=False
9227465
9227465
9227465
9227465
9227465
9227465
9227465
9227465

real    0m5.608s
user    0m5.618s
sys    0m0.012s
(base) root@75f68d8ff029:~/nogil# time /root/python3.13/bin/python3.13 /tmp/x2.py
nogil=False
9227465
9227465
9227465
9227465
9227465
9227465
9227465
9227465

real    0m5.602s
user    0m5.591s
sys    0m0.028s

 

------------------------------------------

 

 

nogil python3.9的表现(8线程):

(base) root@75f68d8ff029:~/nogil# time /root/python3.9_nogil/bin/python3.9 /tmp/x2.py
nogil=True
9227465
9227465
9227465
9227465
9227465
9227465
9227465
9227465

real    0m0.506s
user    0m3.816s
sys    0m0.012s
(base) root@75f68d8ff029:~/nogil# time /root/python3.9_nogil/bin/python3.9 /tmp/x2.py
nogil=True
9227465
9227465
9227465
9227465
9227465
9227465
9227465
9227465

real    0m0.514s
user    0m3.882s
sys    0m0.004s
(base) root@75f68d8ff029:~/nogil# time /root/python3.9_nogil/bin/python3.9 /tmp/x2.py
nogil=True
9227465
9227465
9227465
9227465
9227465
9227465
9227465
9227465

real    0m0.502s
user    0m3.815s
sys    0m0.004s

 

 

可以看到python3.9_nogil项目对多线程的代码在no-GIL情况下确实可以得到非常好的效果。

 

 

 

=============================================

 

posted on   Angry_Panda  阅读(300)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
历史上的今天:
2021-08-03 Ubuntu18.04 server 双网卡,一个设置为静态IP, 一个设置为动态IP
2021-08-03 【转载】 Ubuntu 中开机自动执行脚本的两种方法
2021-08-03 Ubuntu18.04server 双网卡,开机自动设置路由并启动校园网网络认证程序(Ubuntu开机自动设置路由,开机自启动应用程序)
2021-08-03 mpi4py 官方使用手册

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示