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

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

时间:2023-08-03 20:02:48浏览次数:44  
标签: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)

 

 

测试结果:

 

 

 

可以看到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://www.cnblogs.com/devilmaycry812839668/p/17604295.html

相关文章

  • [论文阅读笔记] AnoShift - A Distribution Shift Benchmark for U
    AnoShift:ADistributionShiftBenchmarkforUnsupervisedAnomalyDetection主要贡献点:用t-SNE,OptimalTransportDatasetDistance分析了网络流量中用于无监督异常检测任务的大型常用数据集(Kyoto-2006+),并证明其受到分布偏移的影响。我们提出了基于时间顺序的基准测试,重......
  • python中的注释noqa: F401
    在Python中,"noqa:F401"是一个特殊的注释指示。它主要用于在静态代码检查工具(例如Flake8)运行时,告知工具忽略特定的"F401"错误。"F401"是Flake8静态代码检查工具中的一种错误代码。具体来说,它表示"moduleimportedbutunused",即导入了模块但未在代码中使用。通常情况下,代......
  • ubuntu18.04安装nodejs最新版、指定版 12.x 14.x
    ubuntu18.04安装nodejs最新版、指定版12.x14.x 今天准备在ubuntu服务器里面安装nodejs版本,ubuntu18.04仓库nodejs默认是8.x版本。1.通过apt安装nodejs在Ubuntu18.04的默认仓库包含了一个Node.js的版本,截至当前,该仓库的node.js版本是8.10.0。要安......
  • 记录一下Linux下远程访问Mysql连接不上,报错The driver has not received any packets
    问题所在远程服务器已经提前安装好了MySQL,版本也是对应的。在ssh上可以正常进入MySQL数据库。但是其他地方无法连接上,例如navicat和IDE内部都发生报错。排查1.首先排查了一下远程服务器上mysql服务状态是否处于正常运行状态sudoservicemysqldstatus没有发生问题。2.检......
  • Linux下Nodejs安装三种方式及开发环境
    很久之前安装过windows下以及Mac下的node,感觉还是很方便的,不成想今天安装linux下的坑了老半天,特此记录。    首先去官网下载代码,这里一定要注意安装分两种,一种是SourceCode源码,一种是编译后的文件。我就是按照网上源码的安装方式去操作编译后的文件,结果坑了好久好久。    ......
  • python3.13是否移除了GIL的限制
     近日看到新闻:https://baijiahao.baidu.com/s?id=1773013936355276204&wfr=spider&for=pchttps://www.thepaper.cn/newsDetail_forward_24052522?commTag=true         ==================================================  乍一看好像说的是Pytho......
  • webpack5 devServer浏览器打开显示 can not get
    webpack5中通过使用webpack-dev-server插件,配置devServer来浏览器启动页面,对于单页面,我们可以直接配置打开首页,多页面,可以配置打开一个文件目录,选择各个页面的目录当我们配置好webpack后,执行npmrundev,浏览器打开经常会看到显示  cannotget,即无法匹配服务器匹配的目......
  • [async]子线程内开启协程 RuntimeError: There is no current event loop in thread '
    在子线程内直接获取事件循环会报错:RuntimeError:Thereisnocurrenteventloopinthread'Thread-2',此时的代码为:loop=asyncio.get_event_loop()loop.run_until_complete(协程函数) #执行解决方法:在子线程内创建并配置事件循环new_loop=asyncio.new_event_loop(......
  • 进程,线程和协程;为什么有了GIL锁还要互斥锁;多态和多态性;鸭子类型
    进程,线程和协程;为什么有了GIL锁还要互斥锁;多态和多态性;鸭子类型为什么有了GIL锁还要互斥锁1.GIL本身就是一个大的互斥锁2.同一个进程下资源是共享的,也就是说多条线程可以操作同一个变量3.多个线程可以操作同一个变量就会出现数据安全问题4.临界区:指一段代码或一段程序片段,需......
  • PeneTration Notes(二)
    SNotes-2信息收集给出渗透目标:单位名称、靶标。单位信息首先需要收集单位的基本信息,通过:天眼查:登录后基本服务免费,可以免费查询单层股权穿透信息企查查:爱企查:登录即可免费使用绝大部分服务,但可能信息不全主要需要获取:法定代表人、单位官网、对外邮箱、股权穿透信息主要......