Retour sur la première année de Python free-threaded
(labs.quansight.org)- Python free-threaded est conçu pour exploiter efficacement le matériel multicœur
- Dans CPython 3.14, la sécurité des threads et les performances des modules clés ont été nettement améliorées
- De nombreux packages majeurs ne prennent toujours pas en charge les builds free-threaded
- Chacun peut contribuer à ses progrès grâce à des retours en conditions réelles et à la contribution communautaire
Vue d’ensemble
La semaine dernière, CPython 3.14.0b1 a été publié, et cette semaine PyCon 2025 débute à Pittsburgh
Ces deux événements marquent des étapes importantes pour le déploiement et la stabilisation de Python free-threaded
Cet article revient sur l’année écoulée et explique comment l’équipe de Quansight a joué un rôle clé dans l’adoption expérimentale du build free-threaded au sein de workflows de production réels avec des dépendances complexes
Sens et nécessité de Python free-threaded
- La prise en charge de Python free-threaded permet de mobiliser l’ensemble des ressources de calcul du matériel moderne, où CPU et GPU multicœurs sont devenus la norme
- Avec l’approche traditionnelle du GIL (Global Interpreter Lock), exploiter pleinement les algorithmes parallèles nécessitait des contournements et un tuning spécifique
- On utilisait généralement multiprocessing plutôt que le module threading, mais cela implique un coût élevé de création de processus et des copies de données inefficaces
- Lorsqu’un package Python inclut du code natif, un build free-threaded n’est pas automatiquement compatible ; un audit du code est donc indispensable pour garantir la sécurité des threads
- La suppression du GIL a exigé de profonds changements structurels dans l’interpréteur CPython, et a aussi mis en lumière des problèmes structurels dans les packages existants
Principales avancées
- Avec l’équipe Python Runtime de Meta, la prise en charge de Python free-threaded a été apportée à divers packages et projets, notamment :
- des outils de packaging et de workflow comme meson, meson-python, setup-python GitHub Actions, packaging, pip et setuptools
- des générateurs de bindings comme Cython, pybind11, f2py et PyO3
- des packages clés de l’écosystème PyData comme NumPy, SciPy, PyArrow, Matplotlib, pandas, scikit-learn et scikit-image
- des dépendances majeures parmi les plus téléchargées sur PyPI comme Pillow, PyYAML, yarl, multidict et frozenlist
- Des packages populaires encore non compatibles (CFFI, cryptography, PyNaCl, aiohttp, SQLAlchemy, grpcio, etc.) ainsi que des bibliothèques de machine learning (safetensors, tokenizers, etc.) sont également en cours de prise en charge progressive
- Les développeurs core de CPython de l’équipe Quansight ont intégré dans la version 3.14 les améliorations suivantes :
- le module warnings fonctionne désormais de manière thread-safe par défaut dans les builds free-threaded
- amélioration de graves problèmes de sécurité des threads dans asyncio et meilleure scalabilité en parallèle
- amélioration complète de la sécurité des threads dans le module ctypes
- amélioration des performances du garbage collector free-threaded
- optimisation du schéma de deferred reference counting et de l’interpréteur à spécialisation adaptative
- nombreuses corrections de bugs et renforcements de la sécurité des threads
- Un guide complet1 pour la prise en charge de Python free-threaded a également été rédigé, afin de fournir une documentation concrète utile à davantage de packages à l’avenir
État de l’écosystème Python free-threaded
- Il y a un an (au moment de la sortie de 3.13.0b1), l’installation de la plupart des packages Python sur un build free-threaded était massivement cassée
- Les échecs de build venaient moins de problèmes fondamentaux que d’options par défaut non prises en charge ou de petites hypothèses devenues fausses
- Au cours de l’année écoulée, de nombreux problèmes ont été résolus avec l’aide de la communauté, et Cython 3.1.0 a constitué un tournant majeur avec sa prise en charge officielle
- Il reste encore des packages contenant du code compilé mais ne proposant pas de wheels free-threaded
Leur progression peut être suivie dans des tableaux de suivi manuels et automatiques2
Défis actuels
- À ce stade, les builds Python free-threaded ont surtout besoin d’expérimentations et de retours dans des workflows réels
- Il existe un fort potentiel d’amélioration des performances, notamment dans les workflows où le coût du multiprocessing est élevé, mais un audit fin de la stabilité des threads reste indispensable pour chaque package
- De nombreuses bibliothèques fournissent des structures de données mutables sans documenter correctement leur sécurité des threads, ni la garantir réellement
- Quand les packages sont volumineux et fortement hérités du legacy, il manque souvent des personnes capables d’en comprendre entièrement le code, ce qui ralentit la prise en charge
- À l’échelle de la communauté, des efforts sont nécessaires pour assurer la pérennité de la maintenance des packages essentiels
Comment contribuer
- Il est possible de consulter le guide de contribution officiel
- Le suivi des problèmes à l’échelle de l’écosystème et les principaux documents de compatibilité sont gérés dans le dépôt free-threaded-compatibility5
- Il est aussi possible de participer aux discussions et aux contributions sur le Discord communautaire animé par Quansight-Labs6
Présentations prévues à la PyCon
- L’auteur de l’article et son coéquipier Lysandros Nikolaou doivent intervenir lors de PyCon 2025
- Ils prévoient de partager des cas concrets de portage et des retours d’expérience pratiques, avec également une vidéo de la présentation disponible sur YouTube
- Ils estiment que le build free-threaded représente l’avenir du langage Python et se disent très enthousiastes à l’idée de contribuer à sa concrétisation
- Ils espèrent que les efforts d’aujourd’hui marqueront un tournant pour l’avenir des packages variés et massifs qu’utilisent chaque jour des millions de développeurs
1 commentaires
Avis Hacker News
Beaucoup de gens utilisent le multiprocessing, avec la remarque que le coût de création des processus est élevé
La fonctionnalité
SharedMemoryexiste, et il est difficile de comprendre pourquoi elle n’est pas utilisée plus souventIl est souligné que l’expérience avec
ShareableLista été bonneSous Unix, la création d’un processus prend moins de 1 ms
importShareableListne permet de partager que des scalaires atomiques et desbytesou chaînes de caractèrespickle dump, ainsi qu’un coût mémoire lié aux copies par processusRetour d’expérience très positif sur le partage de tableaux numpy
segfaultaléatoires à déboguer si le GIL disparaîtComme les processus peuvent mourir indépendamment, il est difficile de récupérer si un processus meurt alors qu’il modifie une structure de données en mémoire partagée tout en tenant un verrou
La mémoire partagée ne fonctionne que sur du matériel dédié
forkpose un autre problèmeQuestion sur le fait de savoir si la suppression du GIL a d’autres effets sur le code Python multithread que le parallélisme
Le maintien du GIL ne viendrait pas du fait que le multithread en dépend, mais du fait que sa suppression complique l’implémentation de l’interpréteur et des extensions C, tout en ralentissant le code mono-thread
On se demande si Free-threaded Python garde la même garantie historique, à savoir qu’une préemption peut survenir à n’importe quelle frontière de bytecode
Ou bien s’il faut écrire le code différemment, par exemple en utilisant davantage de verrous
Free-threaded Python conserve globalement les mêmes garanties
L’utilisation de plusieurs cœurs est possible, mais avec une baisse des performances par thread et la nécessité de retravailler les bibliothèques
Les situations de concurrence (
race conditions) peuvent devenir plus fréquentes, donc il faudra faire plus attention en écrivant du Python multithread pour garantir la fiabilitéInformation selon laquelle Microsoft a dissous l’équipe Faster Python
L’équipe n’aurait pas été maintenue à cause de résultats prévus insuffisants pour 2025
Il reste à voir si des améliorations de performance continueront à être ajoutées à CPython, ou si d’autres entreprises prendront le relais du financement
Facebook (Meta) semblerait encore assurer une partie du soutien
Il est rappelé que le calendrier a énormément dérapé par rapport aux promesses de Microsoft
C’est regrettable, mais cela confirmerait l’idée de départ selon laquelle il ne fallait pas faire confiance aux engagements de long terme de Microsoft
Une rumeur récente affirme aussi que Google aurait licencié toute son équipe de développement Python
C’est jugé très triste, avec une allusion disant qu’après embrace & extend, il ne reste plus qu’une seule étape
Question de savoir si l’on est le seul à s’inquiéter de la disparition du GIL en Python
Dans n’importe quel langage, le code multithread complexe est difficile à juger fiable, et cela semble encore plus inquiétant avec la nature dynamique de Python
La peur du changement n’est pas isolée, même si elle peut être irrationnelle
asyncplutôt que les threadsasyncioest utilisé activementOn s’attend à une organisation comparable à celle du domaine ML/IA, où des spécialistes construiront d’abord des bibliothèques complexes pour ensuite les mettre à disposition des utilisateurs ordinaires
Il est rappelé, peut-être à tort pour ne pas inquiéter inutilement, que les LLM ont été entraînés sur du code Python écrit avec l’hypothèse de l’existence du GIL pendant des décennies
La présence ou l’absence du GIL ne concerne en pratique que ceux qui veulent exploiter plusieurs cœurs
race conditionsexistent avec ou sans GILUne personne utilise souvent Python sans être experte, et lance parfois simplement plusieurs fonctions en parallèle avec
concurrent.futuresElle demande ce qu’un tel utilisateur devra changer à l’avenir
Les threads n’étant plus liés au GIL, l’ensemble sera plus rapide
Partage d’une impression issue de 20 ans d’expérience en développement professionnel avec Python
Les threads ne sont réellement nécessaires que lorsqu’il est impossible d’éviter le passage de messages
async; il est vivement recommandé de l’apprendreUne autre personne dit utiliser Python depuis aussi longtemps et être d’accord, tout en le formulant un peu différemment
asyncest très fortement recommandé (glyph, tu avais raison !)C’est une image générée par IA, mais il est étrange que le serpent ait deux queues
Avis de soutien humoristique suggérant de ne pas s’y attarder ; il est plaisamment dit que lorsqu’un article sur Python contient une image de serpent, c’est généralement un signal qui ne mérite pas vraiment d’attention
Proposition humoristique du nom
ConfusoborusRemarque selon laquelle le serpent de l’image d’en-tête semble avoir deux queues
Question sur le fait de savoir s’il existe d’autres contraintes, en dehors du support des bibliothèques, pour faire tourner des workers WSGI et Celery dans un seul processus
C’est vu comme un immense travail de fond pour l’ère des performances à venir