Stackless Python

Un article de Wikipédia, l'encyclopédie libre.

Stackless Python est une implémentation du langage Python, nommée ainsi car elle vise à éliminer l'utilisation de la pile du langage C. Le langage supporte les continuations, les générateurs, les microthreads et les coroutines.

À cause du nombre considérable de changements dans le code source, Stackless Python ne peut pas être installé par-dessus une installation préexistante de Python en tant qu'extension ou bibliothèque. Au contraire, il est une distribution Python complète en elle-même. La plupart des fonctions de Stackless Python ont également été implémentées dans PyPy, un interprète Python en Python.

Stackless Python est énormément utilisé dans l'implémentation d'Eve Online, un jeu en ligne massivement multijoueur.

Concevoir[modifier | modifier le code]

Avec Stackless Python, un programme en cours d'exécution est divisé en microthreads qui sont gérés par l'interpréteur de langage lui-même, et non par le noyau du système d'exploitation. Les microthreads gèrent l'exécution de différentes sous-tâches dans un programme sur le même cœur de processeur. Ainsi, ils constituent une alternative à la programmation asynchrone basée sur les événements et évitent également la surcharge liée à l'utilisation de threads séparés pour les programmes monocœur (car aucune commutation de mode entre le mode utilisateur et le mode noyau ne doit être effectuée, de sorte que l'utilisation du processeur peut être réduite)[1].

Bien que les microthreads facilitent l'exécution de sous-tâches sur un seul cœur, Stackless Python ne supprime pas le Global Interpreter Lock de CPython, et n'utilise pas non plus plusieurs threads et/ou processus. Il n'autorise donc que le multitâche coopératif sur un processeur partagé et non le parallélisme (la préemption n'était pas disponible à l'origine mais est maintenant sous une forme[2]). Pour utiliser plusieurs cœurs de processeur, il faudrait toujours créer un système de communication interprocessus au-dessus des processus Python Stackless.

En raison du nombre considérable de modifications dans la source, Stackless Python ne peut pas être installé sur une installation Python préexistante en tant qu'extension ou bibliothèque. Il s'agit plutôt d'une distribution Python complète en soi. La majorité des fonctionnalités de Stackless ont également été implémentées dans PyPy, un interpréteur Python auto-hébergé et un compilateur JIT[3].

Utilisation[modifier | modifier le code]

Bien que l'ensemble Stackless soit une distribution distincte, sa fonctionnalité de commutation a été empaquetée avec succès sous la forme d'une extension CPython appelée greenlet[4]. Il est utilisé par un certain nombre de bibliothèques (par exemple gevent[5]) pour fournir une solution de threading verte pour CPython. Python a depuis reçu une solution native pour les threads verts : wait/async.

Stackless est largement utilisé dans la mise en œuvre du jeu en ligne massivement multijoueur Eve Online ainsi que dans la plate-forme de messagerie d'IronPort.

Notes et références[modifier | modifier le code]

  1. Al Sweigart, Automate the Boring Stuff with Python, No Starch Press, (lire en ligne)
  2. « About Stackless » (consulté le ) : « a round robin scheduler is built in. It can be used to schedule tasklets either cooperatively or preemptively. »
  3. « Application-level Stackless features — PyPy documentation », sur pypy.readthedocs.org
  4. « greenlet: Lightweight concurrent programming — greenlet 0.4.0 documentation », sur greenlet.readthedocs.org
  5. « What is gevent? — gevent 1.3.0.dev0 documentation », sur www.gevent.org

Liens externes[modifier | modifier le code]