Maison >développement back-end >Tutoriel Python >Mode threadé gratuit dans PythonGIL désactivé)
Python 3.13 vient de sortir récemment, avec une nouvelle fonctionnalité étonnante appelée "Mode threadé gratuit". Il s'agit d'une grande amélioration des performances de votre code lorsque vous utilisez des threads. Cet article montre comment activer cette fonctionnalité (non activée par défaut) et montre l'impact du "mode threadé gratuit" sur les performances de votre code.
Pour les utilisateurs Windows et MacOS, téléchargez simplement le dernier programme d'installation depuis le site Web de Python. Lorsque vous installez Python, une case à cocher permet d'activer le « Mode threadé gratuit » lorsque vous sélectionnez l'option « Personnaliser l'installation ».
Pour les utilisateurs d'Ubuntu, vous pouvez activer cette fonctionnalité en exécutant la commande suivante dans votre terminal :
sudo add-apt-repository ppa:deadsnakes sudo apt-get update sudo apt-get install python3.13-nogil
Après avoir installé le package, vous pouvez exécuter votre code avec python3.13 (original) et python3.13-nogil ou python3.13t (Python threadé gratuit).
Consultez cet article pour plus de détails sur la façon d'installer Python 3.13 expérimental sur les distributions Linux.
Pour vérifier que votre Python a activé le « Mode threadé gratuit », vous pouvez utiliser la commande suivante :
python3.13t -VV Python 3.13.0 experimental free-threading build (main, Oct 8 2024, 08:51:28) [GCC 11.4.0]
Voyons l'impact du mode threadé gratuit sur un code simple ci-dessous :
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")
Plus tard, j'exécuterai ce code avec Python normal (binaire python3.13) et Python à thread gratuit (binaire pypy3.13t).
Tout d'abord, exécutez le test avec 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
Ensuite, lancez le test avec 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
J'essaye aussi avec 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 par défaut a un mécanisme de verrouillage GIL (Global Interpreter Lock), ce qui rend le multithread non parallèle. Vous pouvez voir que le temps de traitement d'un seul thread est similaire à celui de plusieurs threads.
Avec python3.11t (mode threadé gratuit), les performances multithread sont beaucoup plus rapides que celles avec un seul thread. Ainsi, le multithreading est désormais réellement parallèle.
Mais voyez-vous le test Single Thread dans python3.13t un peu plus lent que pypy3.13 ?
Je ne comprends pas vraiment pourquoi, alors faites-moi savoir si vous avez des explications.
Je pense qu'il est bon d'utiliser le multithreading en python pour le traitement parallèle. Mais, sans mécanisme de verrouillage GIL, cela oblige le développeur à faire attention à la "sécurité des threads", c'est-à-dire. partage de données entre les threads.
De plus, nous devons attendre la mise à jour des bibliothèques et des packages pour prendre pleinement en charge le mode threadé gratuit. C'est l'une des raisons pour lesquelles ce "mode threadé gratuit" n'est pas activé par défaut pour le moment. Mais je pense que ce sera une fonctionnalité intéressante à l’avenir.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!