Question

Il y a beaucoup de questions liées à Stackless Python. Mais aucune réponse à cette ma question, je pense (me corriger si mal - s'il vous plaît!). Il y a un certain buzz autour de tout le temps donc je curieux de savoir. Que dois-je utiliser pour Stackless? Comment est-il mieux que CPython?

Oui, il a des fils verts (Stackless) qui permettent de créer rapidement de fils légers tant qu'aucune opération ne bloque (quelque chose comme les fils de Ruby?). Qu'est-ce que ce grand pour? Quelles sont les autres caractéristiques, il a je veux utiliser plus CPython?

Était-ce utile?

La solution

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

Ce test article faisant juste que, créant cent mille tasklets dans les deux Python et 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 ils vantent leurs co-routines mise en œuvre, Python gagne encore.

Stackless serait bon de mettre en œuvre une map / reduce algorithme, où vous pouvez avoir un très grand nombre de réducteurs en fonction de vos données d'entrée.

Autres conseils

principal avantage de Stackless Python est le support pour coroutines très léger. CPython ne supporte pas nativement coroutines (bien que j'attends quelqu'un d'afficher un hack basé générateur dans les commentaires) si Stackless est une nette amélioration sur CPython lorsque vous avez un problème qui bénéficie de coroutines.

Je pense que la zone principale où ils sont excellent quand vous avez beaucoup de tâches simultanées en cours d'exécution au sein de votre programme. Les exemples pourraient être des entités de jeu qui exécutent un script de mise en boucle pour leur IA, ou un serveur Web qui assure le service de nombreux clients avec des pages qui sont lentes à créer.

Vous avez encore beaucoup des problèmes typiques avec exactitude de la concurrence mais en ce qui concerne les données partagées, mais le changement de tâche déterministe facilite l'écriture de code en toute sécurité puisque vous savez exactement où le contrôle sera transféré et donc connaître les points précis où Partagée Etat doit être à jour.

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

  

(..) stackless ajoute une nouvelle tournure à cette situation en permettant des tâches à séparer en petites tâches, tasklets, qui peuvent ensuite être scindés le programme principal d'exécuter eux-mêmes. Ceci peut être utilisé pour le feu et oublier les tâches, comme l'envoi de courrier électronique un ou l'envoi d'un événement, ou pour les opérations d'entrées-sorties, par exemple envoyer et recevoir des paquets de réseau. Un tasklet attend un paquet du réseau tandis que d'autres continuent à courir la boucle de jeu.

     

Il est en quelque sorte comme des fils, mais il est non préemptif et explicitement prévu, donc il y a moins de problèmes avec la synchronisation. En outre, la commutation entre tasklets est beaucoup plus rapide que la commutation de fil, et vous pouvez avoir un grand nombre de tasklets actifs alors que le nombre de fils est sévèrement limité par le matériel informatique.

(obtenu cette citation de )

A PyCon 2009 il a été donné de conversation très intéressant, expliquant pourquoi et comment Stackless est utilisé à CCP Games.

En outre, il y a un très bon

est largement programmé EVE Online dans Stackless Python. Ils ont plusieurs blogs dev sur l'utilisation de celui-ci. Il semble qu'il est très utile pour le calcul haute performance.

Alors que je ne l'ai pas utilisé Stackless lui-même, je l'ai utilisé Greenlet pour la mise en œuvre des applications de réseau hautement concurrentes. Certains des cas d'utilisation Linden Lab a mis vers sont: mandataires intelligents de haute performance, un système rapide pour la distribution des commandes plus grand nombre de machines, et une application qui fait une tonne d'écriture de base de données et lit (à un rapport d'environ 1 : 2, ce qui est très lourd en écriture, il est donc passé la majeure partie de son temps d'attente pour la base de données pour revenir), et un type tisseur chose web pour les données Web internes. Fondamentalement, toute application qui est attend d'avoir à faire beaucoup de réseau d'E / S bénéficieront d'être en mesure de créer un fils légers bajillion. 10.000 clients connectés ne semble pas être une affaire énorme pour moi.

Stackless ou Greenlet ne sont pas vraiment une solution complète, cependant. Ils sont très bas niveau et vous allez devoir faire beaucoup de monkeywork pour construire une application avec ceux qui les utilisent à leur maximum. Je sais que cela parce que je maintiens une bibliothèque qui fournit une couche de mise en réseau et la planification au-dessus de Greenlet, en particulier parce que l'écriture des applications est tellement plus facile avec elle. Il y a un tas de ces maintenant; Je maintiens eventlet, mais aussi il y a concurrence, chirale, et probablement un peu plus que je ne sais pas.

Si le type d'application que vous voulez écrire des sons comme ce que j'ai écrit, considérez une de ces bibliothèques. Le choix de Stackless vs Greenlet est un peu moins important que de décider quelle bibliothèque convient le mieux aux besoins de ce que vous voulez faire.

L'utilité de base pour les fils verts, la façon dont je le vois, est de mettre en place un système dans lequel vous avez une grande quantité d'objets qui font des opérations de latence élevée. Un exemple concret communiquerait avec d'autres machines:

def Run():
    # Do stuff
    request_information() # This call might block
    # Proceed doing more stuff

Threads vous permettent d'écrire le code ci-dessus naturellement, mais si le nombre d'objets est assez grand, les fils ne peuvent pas exécuter de manière adéquate. Mais vous pouvez utiliser des fils verts, même dans des quantités vraiment importantes. Le request_information() ci-dessus pourrait changer vers un certain programmateur où d'autres travaux est en attente et revenir plus tard. Vous obtenez tous les avantages d'être en mesure d'appeler « blocage » fonctions comme si elles retournent immédiatement sans utiliser threads.

Ceci est évidemment très utile pour tout type de calcul distribué si vous voulez écrire le code d'une manière simple.

Il est également intéressant pour plusieurs cœurs pour atténuer l'attente pour les serrures:

def Run():
    # Do some calculations
    green_lock(the_foo)
    # Do some more calculations

La fonction green_lock serait essentiellement tenter d'acquérir le verrou et juste passer vers un programmateur principal si elle échoue en raison d'autres noyaux en utilisant l'objet.

Encore une fois, les fils verts sont utilisés pour atténuer le blocage, ce qui permet le code à écrire naturellement et effectuer encore bien.

scroll top