夷老永宜 發表於 2025-10-14 21:02:00

python3.14版本的free-threading功能体验

<p><span>操作系统:Debian 12_x64</span></p>
<p><span>python版本: 3.14.0</span></p>
<p><span>最新发布的python3.14.0版本已经正式支持free-threading功能,可以在python中关闭GIL,更好地利用多核 CPU 的性能。</span></p>
<p>今天安装该版本进行了体验,并做了简单测试,这里整理成笔记记录下来,希望对你有帮助。</p>
<p><span>python 3.14.0发布页:</span></p>
<p><span><span>https://www.python.org/downloads/release/python-3140/</span></span></p>
<p><img src="https://img2024.cnblogs.com/blog/300959/202510/300959-20251014204446596-1072710021.png" alt="image" loading="lazy"></p>
<h2><span><span>一、功能说明</span></span></h2>
<p><span>从3.13版本开始,python引入了<span>free-threading功能,其中GIL可被关闭,python线程可充分利用多核cpu资源,这里做下简单介绍。</span></span></p>
<p><span><span>1)通过源码安装时,需要添加 --disable-gil 标志;</span></span></p>
<p><span><span>2)可通过如下方式查看是否支持free-threading功能:</span></span></p>
<p><span>python -VV</span></p>
<p><span>sys.version</span></p>
<p><span>sys._is_gil_enabled()</span></p>
<p><span><span>3)线程安全方面</span></span></p>
<p><span>free-threading版本的python旨在提供与启用GIL功能python版本类似的线程安全行为,通过内部锁来实现dict、list 和 set这些内置数据类型的线程安全。</span></p>
<p><span>说明:官方文档建议尽量使用 threading.Lock 或其他同步原语,而不是依赖内置类型的内部锁。</span></p>
<p><span>更多信息请参考官方文档,可参考官方文档:</span></p>
<p><span><span>https://docs.python.org/3/howto/free-threading-python.html</span></span></p>
<p><img src="https://img2024.cnblogs.com/blog/300959/202510/300959-20251014204512006-800657455.png" alt="image" loading="lazy"></p>
<h2><span><span>二、环境准备</span></span></h2>
<p><span>这里使用源码编译的方式安装python3.14.0版本,如果嫌麻烦,可直接下载预编译的二进制文件。</span></p>
<p><span>源码下载地址:</span></p>
<p><span><span>https://www.python.org/ftp/python/3.14.0/Python-3.14.0.tgz</span></span></p>
<p><span>预编译二级制下载地址可从页面获取:</span></p>
<p><span><span>https://www.python.org/downloads/release/python-3140/</span></span></p>
<p><img src="https://img2024.cnblogs.com/blog/300959/202510/300959-20251014204551738-1337659673.png" alt="image" loading="lazy"></p>
<p>&nbsp;编译时需要添加关闭gil选项:</p>
<p><span>--disable-gil</span></p>
<p><span>安装依赖:</span></p>
<div class="cnblogs_code">
<pre>apt install gcc bzip2 libssl-dev libssl3 openssl xzip lzma sqlite3 libgdbm-dev tk libffi-dev</pre>
</div>
<p><span>编译及安装:</span></p>
<div class="cnblogs_code">
<pre>./configure --enable-optimozations --enable-shared --disable-gil--prefix=/usr/local/<span style="color: rgba(0, 0, 0, 1)">python314
make
make altinstall</span></pre>
</div>
<p><span>编辑环境脚本(env.sh):</span></p>
<div class="cnblogs_code">
<pre>#! /bin/<span style="color: rgba(0, 0, 0, 1)">bash
export CFLAGS</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-I/usr/local/python314/include</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
export LDFLAGS</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-L/usr/local/python314/lib</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
export LD_LIBRARY_PATH</span>=/usr/local/python314/lib</pre>
</div>
<p><span>环境生效:</span></p>
<div class="cnblogs_code">
<pre> source env.sh</pre>
</div>
<p><span>可以通过-VV参数查看是否支持free-threading功能:</span></p>
<div>
<p><img src="https://img2024.cnblogs.com/blog/300959/202510/300959-20251014204913926-1880697749.png" alt="image" loading="lazy"></p>
<p>&nbsp;也可通过以下方式查看是否支持free-threding功能:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">sys._is_gil_enabled()
sys.version</span></pre>
</div>
<p><img src="https://img2024.cnblogs.com/blog/300959/202510/300959-20251014204946250-696780678.png" alt="image" loading="lazy"></p>
<h2><span><span>三、测试验证</span></span></h2>
<p><span>这里使用简单的多线程代码进行验证。</span></p>
<p><span>测试代码如下(thrdTest1.py):</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> threading
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> time,random
</span><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> fun(interval):
    counter </span>=<span style="color: rgba(0, 0, 0, 1)"> 0
    </span><span style="color: rgba(0, 0, 255, 1)">while</span><span style="color: rgba(0, 0, 0, 1)"> True:
      a</span>=random.randint(10000,99999) * random.randint(10000,99999<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">for</span> i <span style="color: rgba(0, 0, 255, 1)">in</span> range(3<span style="color: rgba(0, 0, 0, 1)">):
    t </span>= threading.Thread(target=fun,args=(1<span style="color: rgba(0, 0, 0, 1)">,))
    t.daemon </span>=<span style="color: rgba(0, 0, 0, 1)"> True
    t.start()
time.sleep(</span>100)</pre>
</div>
<p><span>启动脚本如下(start.sh):</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">! /bin/bash</span>
export CFLAGS=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-I/usr/local/python314/include</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
export LDFLAGS</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-L/usr/local/python314/lib</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
export LD_LIBRARY_PATH</span>=/usr/local/python314/<span style="color: rgba(0, 0, 0, 1)">lib
</span>/usr/local/python314/bin/python3.14 thrdTest1.py</pre>
</div>
<p><span>运行效果如下:</span></p>
<div>
<p><img src="https://img2024.cnblogs.com/blog/300959/202510/300959-20251014205050177-1679920118.png" alt="image" loading="lazy"></p>
<p><span>由图可以看出:</span></p>
<p><span>3个线程跑满3个cpu,free-threading功能可充分发挥多核cpu优势。</span></p>
<h2><span><span>四、资源获取</span></span></h2>
<p><span>本文相关资源及运行环境,可从如下渠道获取:</span></p>
<div>关注微信公众号(聊聊博文,文末可扫码)后回复&nbsp;20251014&nbsp;获取。</div>
</div>
</div>
<p><img src="https://img2024.cnblogs.com/blog/300959/202510/300959-20251014205120620-1658248154.png" alt="image" loading="lazy"></p>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    如果你对该文章有疑问,可通过微信公众号(聊聊博文)向我提问:<br>

<img src="https://files.cnblogs.com/files/MikeZhang/201804weixingongzhong1.gif" width="170"><br>
转载请注明出处,谢谢!<br><br>
来源:https://www.cnblogs.com/MikeZhang/p/19142002/python314-20251014
頁: [1]
查看完整版本: python3.14版本的free-threading功能体验