首页  >  文章  >  后端开发  >  PythonGIL 中的自由线程模式已禁用)

PythonGIL 中的自由线程模式已禁用)

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-11 10:17:02985浏览

Python 3.13 最近刚刚发布,具有一个令人惊叹的新功能,称为“自由线程模式”。当您使用线程时,这对于代码的性能来说是一个很大的改进。本文展示了如何启用此功能(默认情况下不启用)并展示“自由线程模式”对代码性能的影响。

安装免费线程Python

Windows 和 MacOS 用户

对于 Windows 和 MacOS 用户,只需从 Python 网站下载最新的安装程序即可。当您安装Python时,当您选择“自定义安装”选项时,会有一个启用“自由线程模式”的复选框。

Free Threaded Mode in PythonGIL disabled)

Ubuntu 用户

对于 Ubuntu 用户,您可以通过在终端中运行以下命令来启用此功能:

sudo add-apt-repository ppa:deadsnakes
sudo apt-get update
sudo apt-get install python3.13-nogil

验证自由线程模式已启用

安装包后,您可以使用 python3.13(原始)和 python3.13-nogil 或 python3.13t(免费线程 Python)运行代码。

查看这篇文章,了解有关如何在 Linux 发行版上安装 Python 3.13 实验版的更多详细信息。

要验证您的 Python 是否启用了“自由线程模式”,您可以使用以下命令:

python3.13t -VV
Python 3.13.0 experimental free-threading build (main, Oct  8 2024, 08:51:28) [GCC 11.4.0]

自由线程模式性能

实验设置

让我们看看自由线程模式对下面简单代码的影响:

  • 我有一个函数工作者,它执行一些计算并返回 0 到 1000 万之间的数字总和。
  • 我有“测试 1”来按顺序运行工作函数 5 次。
  • 我有“测试 2”来使用多个线程并行运行工作函数,线程数为 5。
  • 我确实测量了这两个测试的执行时间。
import sys
import threading
import time

print("Python version : ", sys.version)

def worker():
    sum = 0
    for i in range(10000000):
        sum += i


n_worker = 5
# Single thread

start = time.perf_counter()
for i in range(n_worker):
    worker()
print("Single Thread: ", time.perf_counter() - start, "seconds")


# Multi thread
start = time.perf_counter()
threads = []
for i in range(n_worker):
    t = threading.Thread(target=worker)

    threads.append(t)
    t.start()

for t in threads:
    t.join()
print("Multi Thread: ", time.perf_counter() - start, "seconds")

稍后,我将使用普通 Python(python3.13 二进制文件)和免费线程 Python(pypy3.13t 二进制文件)运行此代码。

结果

首先,使用python3.13运行测试:

python3.13 gil_test.py 
Python version :  3.13.0 (main, Oct  8 2024, 08:51:28) [GCC 11.4.0]
Single Thread:  1.4370562601834536 seconds
Multi Thread:  1.3681392602156848 seconds

然后,使用 pypy3.13t 运行测试:

python3.13t gil_test.py 
Python version :  3.13.0 experimental free-threading build (main, Oct  8 2024, 08:51:28) [GCC 11.4.0]
Single Thread:  1.862126287072897 seconds
Multi Thread:  0.3931183419190347 seconds

我也尝试使用 python3.11:

python3.11 gil_test.py 
Python version :  3.11.3 (main, Apr 25 2023, 16:40:23) [GCC 11.3.0]
Single Thread:  1.753435204969719 seconds
Multi Thread:  1.457715731114149 seconds

结果分析

Python默认有GIL(Global Interpreter Lock)锁定机制,使得多线程实际上并不是并行的。可以看到单线程的时间处理和多线程类似。

使用python3.11t(自由线程模式),多线程性能比单线程快很多。所以,多线程现在实际上是并行的。

但是,你有没有发现 python3.13t 中的单线程测试比 pypy3.13 慢一点?

我不太明白为什么,所以如果你有任何解释请告诉我。

结论

我认为在python中使用多线程进行并行处理是很好的。但是,如果没有GIL锁定机制,则需要开发人员注意“线程安全”,即。在线程之间共享数据。

此外,我们需要等待库和包更新才能完全支持自由线程模式。这就是为什么现在默认情况下不启用“自由线程模式”的原因之一。但是,我认为这将是未来的一个很好的功能。

以上是PythonGIL 中的自由线程模式已禁用)的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn