Maison >développement back-end >Tutoriel Python >Mode threadé gratuit dans PythonGIL désactivé)

Mode threadé gratuit dans PythonGIL désactivé)

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-11 10:17:021109parcourir

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.

Installer Python threadé gratuitement

Utilisateurs Windows et MacOS

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 ».

Free Threaded Mode in PythonGIL disabled)

Utilisateurs d'Ubuntu

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

Vérifiez que le mode threadé libre est activé

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]

Performances du mode threadé gratuit

Configuration de l'expérience

Voyons l'impact du mode threadé gratuit sur un code simple ci-dessous :

  • J'ai un opérateur de fonction qui effectue des calculs et renvoie la somme des nombres de 0 à 10 millions.
  • J'ai le "Test 1" pour exécuter la fonction worker 5 fois, séquentiellement.
  • J'ai le "Test 2" pour exécuter la fonction de travail en parallèle en utilisant plusieurs threads, le nombre de threads étant de 5.
  • Je mesure le temps d'exécution des deux tests.
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).

Résultats

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

Analyse des résultats

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.

Conclusion

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn