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情况下确实可以得到非常好的效果。
=============================================
PEP 703作者给出的一种no-GIL的实现——python3.9的nogil版本的更多相关文章
- 下面给出了四种设计模式的作用: 外观(F
下面给出了四种设计模式的作用: 外观(Fa?ade :为子系统中的一组功能调用提供一个一致的接口,这个接口使得这一子系统更加容易使用: 装饰(Decorate):当不能采用生成子类的方法进行扩充时,动 ...
- 面试官:spring中定义bean的方法有哪些?我一口气说出了12种,把面试官整懵了。
前言 在庞大的java体系中,spring有着举足轻重的地位,它给每位开发者带来了极大的便利和惊喜.我们都知道spring是创建和管理bean的工厂,它提供了多种定义bean的方式,能够满足我们日常工 ...
- Swift 中异常抛出和四种异常处理
在Swift中你可以像其他语言一样抛出异常处理异常,今天我们就详细地说说Swift中的异常抛出和处理. 在一开始我们要定义错误或者说是异常,Swift中的一些简单异常可以使用枚举定义,注意这个枚举要继 ...
- 一口气说出Redis 5种数据结构及对应使用场景,面试要加分的
整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 更多优选 一口气说出 9种 分布式ID生成方式,面试官有点懵了 ...
- 由Eratosthenes筛法演变出的一种素数新筛法
这两天和walls老师交流讨论了一个中学竞赛题,我把原题稍作增强和变形,得到如下一个题: 从105到204这100个数中至少要选取多少个数才能保证选出的数中必有两个不是互素的? 我们知道最小的几个素数 ...
- 太坑了,我竟然从RocketMQ源码中扒出了7种导致消息重复消费的原因
大家好,我是三友~~ 在众多关于MQ的面试八股文中有这么一道题,"如何保证MQ消息消费的幂等性". 为什么需要保证幂等性呢?是因为消息会重复消费. 为什么消息会重复消费? 明明已经 ...
- 基于Visual C++2013拆解世界五百强面试题--题10-找出N个数种最大的K个数
有一亿个整数,请找出最大的 1000 个,要求时间越短越好, 空间占用越好越好. 如果不考虑时间效率,很容易想到解决方法,我们只需存储前一千个数, 然后依次读入后面的数和这一千个数组比较,替换其中比较 ...
- 长度为n的数组,有一个数重复出现了n/2+1次,找出(三种方法)
问题: 长度为n的数组,有一个数重复出现了n/2+1次,找出这个数: 解决: 比较直接的思路是遍历每个元素,让其与剩下其他元素比较,相等一次计数器sum++,直到sum=n/2+1为止: #inc ...
- 海量数据处理面试题(1) 找出两文件种包含的相同的url
问题:给定a.b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a.b文件共同的url? 分析:50亿个url,每个url64字节,就是320G,显然是无法一次读入内存 ...
- JS基础 浏览器弹出的三种提示框(提示信息框、确认框、输入文本框)
浏览器的三种提示框 alert() //提示信息框 confirm() //提示确认框 prompt() //提示输入文本框 1.alert( ) 提示信息框 <script> alert ...
随机推荐
- (九)selenium实现12306模拟登录
登陆的唯一困难在于验证码的识别,此处使用第三方平台超级鹰进行验证码识别. from selenium import webdriver import time from PIL import Imag ...
- es语法 rest api 模拟query 根据中文姓名搜索demo
es语法 rest api 模拟query 根据中文姓名搜索demo order_info_es/_doc/40094182abc GET order_info_es/_settings?pretty ...
- excel计算日期天数和表格冻结首行
excel计算日期天数和表格冻结首行 1.在单元格E35中输入公式DATEDIF(A35.B35."MD")MD表起始日期.结束日期天数差."Y" 时间段中的整 ...
- window10 yapi安装 swagger配置 及 Error: getaddrinfo ENOTFOUND yapi.demo.qunar.com解决
node下载https://nodejs.org/download/release/v12.18.3/mongodb下载https://www.mongodb.com/try/download/ent ...
- Oracle常用命令收藏
查看数据库名 SELECT t.NAME FROM V$DATABASE t; 查看实例名 SELECT t.INSTANCE_NAME FROM V$INSTANCE t; 查看SID select ...
- DVT:华为提出动态级联Vision Transformer,性能杠杠的 | NeurIPS 2021
论文主要处理Vision Transformer中的性能问题,采用推理速度不同的级联模型进行速度优化,搭配层级间的特征复用和自注意力关系复用来提升准确率.从实验结果来看,性能提升不错 来源:晓飞的算法 ...
- power bi 如何删除敏感度标签
经验证,此方法不够彻底,我的office excel打开后还是要添加敏感度标签,即使我把敏感度标签删掉也不行. 当我把创建敏感度标签的管理员账户删掉之后,虽然打开excel还是会显示敏感度标签,但是已 ...
- OpenStack 下 CentOS6.X 镜像网络初始化失败问题排查
问题表现 在我的 OpenStack 集群上迁移了一批老旧的镜像(从其他三方云平台过来的)发现这批镜像在使用 ConfigDrive 的方式注入配置初始化时无法对非首张网卡镜像初始化(后经过测试非 C ...
- Taro 滚动切换tab页
import React, { Component } from 'react' import { View, Text, ScrollView } from '@tarojs/components' ...
- 网易数帆实时数据湖 Arctic 的探索和实践
作者 | 蔡芳芳 采访嘉宾 | 马进 网易数帆平台开发专家 数据中台也要从离线为主走向实时化,湖仓一体是第一步. 数据从离线到实时是当前一个很大的趋势,但要建设实时数据.应用实时数据还面临两个难题.首 ...