42 votes

À quoi servirait Stackless Python ?

De nombreuses questions se posent à propos de Stackless Python. Mais aucune ne répond à ma question, je pense (corrigez-moi si je me trompe - s'il vous plaît !). Il y a un buzz à ce sujet tout le temps, alors je suis curieux de savoir. Pour quoi utiliser Stackless ? En quoi est-il meilleur que CPython ?

Oui, il a des threads verts (stackless) qui permettent de créer rapidement de nombreux threads légers tant qu'aucune opération n'est bloquante (quelque chose comme les threads de Ruby ?). A quoi cela sert-il ? Quelles sont les autres fonctionnalités que j'aimerais utiliser par rapport à CPython ?

31voto

Adal Points 2116

Il vous permet de travailler avec des quantités massives de concurrence. Personne de sensé ne créerait cent mille threads système, mais vous pouvez le faire en utilisant stackless.

C'est précisément ce que teste cet article, en créant cent mille tasklets en Python et en Google Go (un nouveau langage de programmation) : http://dalkescientific.com/writings/diary/archive/2009/11/15/100000_tasklets.html

Étonnamment, même si Google Go est compilé en code natif et qu'ils vantent leur implémentation de co-routines, Python l'emporte toujours.

Stackless serait bien pour implémenter un algorithme map/reduce, où vous pouvez avoir un très grand nombre de reducers en fonction de vos données d'entrée.

12voto

Kylotan Points 14114

Le principal avantage de Stackless Python est la prise en charge de coroutines très légères. CPython ne supporte pas les coroutines de manière native (bien que je m'attende à ce que quelqu'un poste un hack basé sur un générateur dans les commentaires), donc Stackless est une nette amélioration par rapport à CPython lorsque vous avez un problème qui bénéficie des coroutines.

Je pense qu'ils excellent surtout lorsque de nombreuses tâches simultanées sont exécutées dans votre programme. Il peut s'agir par exemple d'entités de jeu qui exécutent un script en boucle pour leur IA, ou d'un serveur web qui dessert de nombreux clients avec des pages qui sont lentes à créer.

La plupart des problèmes typiques liés à la correction de la concurrence se posent toujours en ce qui concerne les données partagées, mais la commutation déterministe des tâches facilite l'écriture d'un code sûr, car on sait exactement où le contrôle sera transféré et on connaît donc les points exacts auxquels l'état partagé doit être mis à jour.

8voto

zeroDivisible Points 1102

Thirler a déjà mentionné que le stackless était utilisé dans Eve Online. Gardez à l'esprit que :

( ) stackless ajoute une touche supplémentaire en permettant de séparer les tâches en tâches plus petites, les Tasklets, qui peuvent ensuite être séparées du programme principal pour s'exécuter de manière autonome. Cela peut être utilisé pour des tâches de type "fire-and-forget", comme l'envoi d'un e-mail ou la distribution d'un événement, ou pour des opérations d'E/S, par exemple l'envoi et la réception de paquets réseau. Une tasklet attend un paquet du réseau pendant que les autres continuent à exécuter la boucle du jeu.

Il ressemble à certains égards aux threads, mais il est non préemptif et explicitement programmé, de sorte qu'il y a moins de problèmes de synchronisation. En outre, le passage d'une tasklet à l'autre est beaucoup plus rapide que le passage d'un thread à l'autre, et il est possible d'avoir un grand nombre de tasklets actives alors que le nombre de threads est sévèrement limité par le matériel informatique.

(cette citation est tirée de aquí )

Lors de la PyCon 2009, il a été donné un exposé très intéressant qui décrit pourquoi et comment Stackless est utilisé à CCP Games.

Il existe également un très bon matériel d'introduction qui explique pourquoi l'absence de pile est une bonne solution pour vos applications. (il est peut-être un peu ancien, mais je pense qu'il vaut la peine d'être lu).

6voto

Thirler Points 6222

EVEOnline est en grande partie programmé en Python sans pile. Il y a plusieurs blogs de développement sur l'utilisation de ce langage. Il semble qu'il soit très utile pour le calcul à haute performance.

6voto

rdw Points 201

Bien que je n'aie pas utilisé Stackless lui-même, j'ai utilisé Greenlet pour mettre en œuvre des applications réseau hautement concurrentes. Linden Lab l'a notamment utilisé pour des proxys intelligents à haute performance, un système rapide pour distribuer des commandes sur un grand nombre de machines, une application qui écrit et lit beaucoup dans une base de données (à un ratio d'environ 1:2, ce qui est très lourd en écriture, et qui passe donc la majeure partie de son temps à attendre que la base de données revienne), et une application de type web-crawler pour les données web internes. En fait, toute application qui s'attend à devoir faire beaucoup d'E/S réseau bénéficiera de la possibilité de créer un milliard de threads légers. 10 000 clients connectés ne me semblent pas être une grosse affaire.

Stackless ou Greenlet ne constituent cependant pas une solution complète. Ils sont de très bas niveau et vous allez devoir faire beaucoup de travail de singe pour construire une application qui les utilise au maximum. Je le sais parce que je maintiens une bibliothèque qui fournit une couche de réseau et d'ordonnancement au-dessus de Greenlet, en particulier parce que l'écriture d'applications est tellement plus facile avec elle. Il y en a plusieurs maintenant ; je maintiens Eventlet, mais il y a aussi Concurrence, Chiral, et probablement quelques autres que je ne connais pas.

Si le type d'application que vous voulez écrire ressemble à ce que j'ai écrit, envisagez l'une de ces bibliothèques. Le choix entre Stackless et Greenlet est un peu moins important que de décider quelle bibliothèque répond le mieux aux besoins de ce que vous voulez faire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X