首页 > 编程语言 >PEP 703作者给出的一种no-GIL的实现——python3.9的nogil版本

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

时间:2023-08-07 14:38:03浏览次数:47  
标签:python3.13 no PEP time print nogil GIL root python3.9

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)

 

 

测试结果:

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

 

 

 

可以看到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情况下确实可以得到非常好的效果。

 

 

 

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

 

标签:python3.13,no,PEP,time,print,nogil,GIL,root,python3.9
From: https://blog.51cto.com/u_15642578/6993353

相关文章

  • 洛谷 P8500 - [NOI2022] 冒泡排序
    显然将权值离散化是没有问题的,因为必然存在一组最优解,满足每个\(a_i\)都取自于某个\(V_i\),于是不管三七二十一先将\(V_i\)离散化了再说。考虑从部分分入手逐步分析这道题:特殊性质A:\(V_i=1\)相当于这个区间中的数必须是\(1\),先将这些数去掉不管,紧接着考虑\(V_i=0\)的......
  • /lib64/libstdc++.so.6: version `GLIBCXX_3.4.26' not found
    原因使用的gcc没有找到对应的glib库。每个版本的glib都会有改变,所以使用的时候必须匹配。大部分是因为自己编译升级了gcc,再用新的gcc编译程序时没有找到当时匹配的类库。查找原因报错提示很明确了,/lib64/libstdc++.so.6中没有找到GLIBCXX_3.4.26版本内容。正常情况/lib64/lib......
  • 解决报错:Redis ERR unknown command ‘FLUSHDB‘
    RedisERRunknowncommand‘FLUSHDB’报错信息:ERRunknowncommand`flushdb`ERRunknowncommand`flushall`解决方案:我的redis版本是5.0.7修改配置文件打开/etc/redis/redis.conf文件,将下面两行代码注释掉rename-commandFLUSHALL37_dba_FLUSHALLrename-commandFLUSHDB......
  • 【错误记录】PySpark 运行报错 ( Did not find winutils.exe | HADOOP_HOME and hadoo
    文章目录一、报错信息二、解决方案(安装Hadoop运行环境)一、报错信息核心报错信息:WARNShell:Didnotfindwinutils.exe:java.io.FileNotFoundException:java.io.FileNotFoundException:HADOOP_HOMEandhadoop.home.dirareunset.在PyCharm中,调用PySpark执......
  • k8s 部分节点 nodelocaldns [ERROR] Failed to read node-cache coreFile /etc/coredn
      部分K8S节点nodelocaldnsCrashLoopBackOff状态报错,报错信息如下:#kubectllogsnodelocaldns-w9mgz-nkube-system2023/08/0703:18:33[INFO]UsingCorefile/etc/coredns/Corefile2023/08/0703:18:33[ERROR]Failedtoreadnode-cachecoreFile/etc/coredns/Co......
  • 详解Nodejs中的Process对象
    在Nodejs中,process是一个全局对象,它提供了与当前进程和运行时环境交互的方法和属性。通过process对象,我们可以访问进程的信息、控制流程和进行进程间通信,这些都是服务端语言应该具备的能力。本文将全面介绍process对象的使用场景,从基础概念到高级应用,带有代码示例,让您深入了解它的......
  • 学习Node.js的基础知识和核心概念(全面)
    Node.js,这个神奇的技术,融合了前端与后端的力量,让JavaScript在服务器端发挥了异乎寻常的魔力。本文将通过代码和文字解释,全面介绍Node.js的特点,从异步非阻塞I/O到强大的模块系统,再到丰富的包管理和事件驱动编程,一步步揭开Node.js的神秘面纱。公众号:Code程序人生,个人网站:https://crea......
  • 用Node.js搭建一个简单Web服务器
    Node.js是基于ChromeV8引擎的JavaScript运行时环境,它允许我们在服务器端运行JavaScript代码,这让我们可以用JavaScript构建Web服务器,处理请求和响应。我们一起探索了如何用Node.js搭建一个简单但强大的Web服务器!什么是Nodejs在搭建Web服务器之前,先让我们了解一下今天的主角Nodejs。......
  • FileNotFoundError: Could not find module 'xxx.dll'. Try using the full path with
    首先看看报错信息 我的python版本是3.8版本,试了网上加各种办法后发现不行。然后怀疑是系统本身的问题,就下载了visual studio,用其中的dumpbin一查,发现果然少了一个dll文件。详细步骤:1.下载并安装visual studio 2.找到开发者命令工具,并打开 3.在打开的控制台上......
  • Nodejs安装教程
    1.下载地址下载地址:https://nodejs.org/zh-cn/download/,根据自己需求选择下载  2.安装1.双击安装包,一直点击【下一步】2.点击change按钮,更换到自己的指定安装位置,点击【下一步】3.一直点击【下一步】,最后安装成功即可3.配置环境变量Node.js安装完成后,我们需要设置环境......