Python deviendra-t-il plus rapide ? Une explication détaillée des « threads gratuits » populaires pour les débutants !
Bonjour,AIJe suis Jon, un blogueur technologique !
「PythonMais je me demande si cela peut être rendu encore plus rapide ? " En fait, un grand changement s'est récemment produit dans le monde de Python qui pourrait bien exaucer ce souhait.« Python à thread libre »!
Si cela vous semble compliqué, ne vous inquiétez pas. Dans cet article, nous aborderons l'IA etProgrammationNous expliquerons comment fonctionne ce nouveau Python et comment l'utiliser de manière simple à comprendre, à l'aide de quatre astuces, afin que même ceux qui ne le connaissent pas puissent comprendre.
Qu'est-ce que le « Python à thread libre » ?
Auparavant, Python appliquait une règle importante appelée « Global Interpreter Lock » (GIL). C'était comme avoir plusieurs chefs dans une cuisine, mais un seul fourneau utilisable à la fois. Un seul chef (thread) pouvait effectuer une cuisson complète (traitement intensif sollicitant le processeur) à la fois, ce qui le rendait peu performant pour un véritable « travail en parallèle ».
Cependant, la version « free-threaded », introduite dans Python 3.13 et officiellement prise en charge dans la version 3.14, permet de supprimer cette restriction GIL (bien qu'elle reste facultative). Cela permet à plusieurs threads de tirer pleinement parti de la puissance du processeur, tout comme plusieurs chefs peuvent cuisiner sur différentes cuisinières simultanément.Nous pouvons désormais travailler en parallèle dans le vrai sens du terme.Ceci est PythonHistoireC'est un très grand changement.
Alors, examinons quatre conseils pour vous aider à tirer le meilleur parti de cette nouvelle fonctionnalité puissante !
Astuce 1 : Tout d’abord, votre travail est-il adapté au « traitement parallèle » ?
La première chose à laquelle vous devez penser est : « Le travail que je souhaite effectuer sera-t-il plus rapide grâce au traitement parallèle ? »
Le threading libre adopte une approche de type « diviser pour mieux régner » en divisant les tâches en plusieurs parties et en travaillant dessus simultanément. Il est donc mieux adapté aux tâches qui peuvent être soigneusement divisées, dites « tâches embarrassantes de parallélisme ».
Cependant, toutes les tâches ne sont pas ainsi. Prenons par exemple l'écriture de nombreux fichiers. Si plusieurs threads tentent d'écrire des fichiers simultanément sur un même disque, ils devront éventuellement faire la queue. Il s'agit d'un processus sérialisé ; l'ajout de threads supplémentaires ne sera donc pas très efficace.
Dans un tel cas,« Divisez le travail en threads distincts et consolidez le travail d'écriture dans les fichiers dans un seul thread dédié. »Cette approche fonctionne bien car elle permet à chaque thread de se concentrer sur son propre travail, sans déranger ou être dérangé par d’autres threads avec son écriture.
Astuce 2 : Utilisez les outils les plus « de haute qualité » possibles
Il existe plusieurs manières (niveaux d'abstraction) de gérer les threads en Python. Comparons cela à la conduite d'une voiture : on peut la conduire avec un volant et des pédales sans connaître les détails du mécanisme du moteur. En programmation, nous recommandons l'utilisation d'outils pratiques (abstraction de haut niveau).
_threadModule: Il s'agit de l'outil de niveau le plus bas. Il traite directement les threads au niveau du système d'exploitation.DébutantC'est assez compliqué.threading.Thread:_threadIl est plus facile à utiliser que , mais vous devez gérer le fil du début à la fin et recevoir les résultats vous-même.concurrent.futures.ThreadPoolExecutor: Il s'agit de l'outil le plus avancé et le plus recommandé. Vous créez un « pool » d'un nombre prédéterminé de threads, vous y ajoutez du travail, et il gère le reste comme bon lui semble. Son principal avantage est de pouvoir travailler de manière asynchrone sans interrompre le programme principal.
Fondamentalement,Le plus haut niveauThreadPoolExecutorutiliserN’oubliez pas que c’est la manière la plus sûre de procéder et qu’elle est la plus susceptible de fonctionner comme prévu.ProcessPoolExecutorSi vous utilisez un outil similaire, vous pouvez facilement le changer en modifiant simplement quelques lignes, puisque l'interface est la même.ThreadPoolExecutorVous pouvez transférer vers.
Astuce 3 : Vérifiez la « sécurité des threads » des extensions du langage C (Cython)
C'est un peu technique, mais Python peut être utilisé pour incorporer des parties rapides (extensions) écrites dans d'autres langages, comme C. Cython est un outil populaire pour cela.
Le plus gros obstacle à l'utilisation de Python à thread libre est de savoir si ces extensions du langage C sont compatibles avec les nouveaux mécanismes, c'est-à-dire.« Sécurité des fils »(Il ne sera pas interrompu même s'il est accessible simultanément à partir de plusieurs threads.)
Si vous utilisez Cython et êtes sûr que votre code est thread-safe, vous pouvez le tester dans une version thread-free en ajoutant simplement la ligne suivante à votre module :
# cython : freethreading_compatible = True
Si vous essayez d'utiliser un module qui n'a pas cette description dans la version à thread libre, Python réactivera automatiquement le GIL (la règle « un seul graveur ») pour des raisons de sécurité.
Cython fournit également des outils pour rendre votre code plus thread-safe.
- Section critique : Il s'agit d'un mécanisme permettant de verrouiller (protéger) temporairement un objet pendant l'exécution d'un bloc de code spécifique. C'est comme afficher un panneau indiquant : « Personne d'autre ne doit toucher à ceci pendant que je travaille dessus. »
- Verrouillage PyMutex : Une fonction de verrouillage plus puissante vous permet de le verrouiller et de le déverrouiller manuellement.
Astuce 4 : Il y a certaines choses que vous ne devriez pas partager entre les fils de discussion
Enfin, un point très important à noter : certains objets possèdent leur propre état interne et ne doivent pas être partagés entre plusieurs threads, car cela perturberait leur état interne. Voici deux exemples courants :
- Objets itérateurs : Il s'agit d'un objet permettant de récupérer des données dans l'ordre. Par exemple, c'est comme un marque-page dans un livre. Si deux personnes tentent de lire le même livre avec le même marque-page, elles ne sauront pas où elles l'ont lu. De même, un itérateur ne doit pas être partagé entre plusieurs threads. (Le partage des données récupérées par un itérateur est acceptable si cela est sûr.)
- Objet cadre : Il enregistre l'état d'un programme à un moment précis de son exécution et est principalement utilisé pour le débogage (recherche d'erreurs). Son état interne est également complexe, et son partage entre threads peut donc poser problème.
Ces objets sont :« Ne le transmettez pas à travers les fils de discussion »Rappelons-le.
Un commentaire de l'auteur
Nous pensons que le free-threading représente une avancée majeure pour Python. Bien qu'un peu technique au départ, il nous permettra de créer des applications plus rapides et plus puissantes que jamais. Nous avons hâte de voir les formidables résultats que les développeurs du monde entier créeront grâce à cette nouvelle puissance.
Cet article est basé sur les articles originaux suivants et est résumé du point de vue de l'auteur :
4 conseils pour débuter avec Python à thread libre
