181 votes

Quand utiliser Tornado, quand utiliser Twisted / Cyclone / GEvent / autre

Lequel de ces frameworks / bibliothèques serait le meilleur choix pour construire une application web moderne multi-utilisateurs ? J'aimerais avoir un serveur web asynchrone qui me permette d'évoluer facilement. Quelle solution donnera le meilleure performance / évolutivité / le cadre le plus utile (en termes de facilité d'utilisation et de développement) ?

Ce serait génial s'il fournissait de bonnes fonctionnalité (websockets, rpc, streaming, etc).

Quels sont les avantages et les inconvénients de chaque solution ?

223voto

dhilipsiva Points 867

" Django est un cadre Web Python de haut niveau qui encourage le développement rapide et la conception propre et pragmatique". . Si vous construisez quelque chose qui ressemble à un site de commerce électronique, alors vous devriez probablement opter pour Django. Il vous permettra d'accomplir votre travail rapidement. Vous n'avez pas à vous soucier de trop de choix technologiques. Il fournit tout ce dont vous avez besoin, du moteur de modèles à l'ORM. Il sera légèrement opiniâtre sur la façon dont vous structurez votre application, ce qui est une bonne chose si vous voulez mon avis. Et elle possède la plus forte communauté de toutes les autres bibliothèques, ce qui signifie qu'une aide facile est disponible.

" Flacon est un micro-framework pour Python basé sur Werkzeug, Jinja 2 et de bonnes intentions". . Attention - "microframework" peut être trompeur. Cela ne veut pas dire que Flask est une bibliothèque mal conçue. Cela signifie que le noyau de Flask est très, très simple. Contrairement à Django, il ne prendra aucune décision technologique pour vous. Vous êtes libre de choisir n'importe quel moteur de modèle ou ORM qui vous plaît. Même s'il est livré avec le moteur de modèle Jinja par défaut, vous êtes toujours libre de choisir le nôtre. Pour autant que je sache, Flask est très utile pour écrire des points d'extrémité d'API (services RESTful).

" Torsadé est un moteur de mise en réseau piloté par les événements, écrit en python". . Il s'agit d'un moteur à haute performance. La principale raison de sa rapidité est ce qu'on appelle les différés. Twisted est construit sur des différés. Pour ceux d'entre vous qui ne connaissent pas les différés, c'est le mécanisme par lequel l'architecture asynchrone est réalisée. Twisted est très rapide. Mais il n'est pas adapté à l'écriture de webapps conventionnelles. Si vous voulez faire quelque chose de bas niveau en réseau, Twisted est votre ami.

" Tornade est un framework web Python et une bibliothèque de mise en réseau asynchrone, développée à l'origine chez FriendFeed. En utilisant des E/S réseau non bloquantes, Tornado peut s'adapter à des dizaines de milliers de connexions ouvertes, ce qui le rend idéal pour les longs polling, les WebSockets et d'autres applications qui nécessitent une connexion de longue durée avec chaque utilisateur." . Tornado se situe quelque part entre Django et Flask. Si vous voulez écrire quelque chose avec Django ou Flask, mais que vous avez besoin d'une meilleure performance, vous pouvez opter pour Tornado. Il peut très bien gérer le problème C10k s'il est bien architecturé.

" Cyclone est un framework de serveur web pour Python qui implémente l'API Tornado en tant que protocole Twisted". . Maintenant, que faire si vous voulez quelque chose qui est presque aussi performant que Twisted mais facile à écrire pour les applications web conventionnelles ? Dites bonjour à Cyclone. Je préfère Cyclone à Tornade. Il a une API qui est très similaire à Tornado. En fait, c'est un fork de Tornado. Mais le problème est qu'il a une communauté relativement petite. Alexandre Fiori est le seul commiter principal du repo.

" Pyramide est un cadre général de développement d'applications web en Python, à code source ouvert. Son objectif principal est de faciliter la création d'applications web par un développeur Python." Je n'ai pas vraiment utilisé Pyramid, mais j'ai parcouru la documentation. D'après ce que j'ai compris, Pyramid est très similaire à Flacon et je pense que vous pouvez utiliser Pyramide partout où Flacon semble approprié et vice-versa.

EDIT : Les demandes de révision de tout autre cadre sont les bienvenues !

Source : http://dhilipsiva.com/2013/05/19/python-libraries-django-twisted-tornado-flask-cyclone-and-pyramid.html

60voto

Glyph Points 17756

Il s'agit manifestement d'un quelque peu biaisé réponse, mais ce n'est pas la même chose qu'une mauvais réponse ; vous devez toujours utiliser Twisted. J'ai répondu questions similaires avant, mais puisque votre question n'est pas tout à fait la même, voici quelques raisons :

"Meilleure performance"

Twisted surveille en permanence ses performances au vitesse.twistedmatrix.com site web. Nous avons également été l'un des premiers projets à surveiller par le site similaire de PyPy Ce qui permet de garantir les bonnes performances de Twisted sur le runtime que toute personne concernée par les applications hautes performances en Python.

"Scalability"

À ma connaissance, aucun des frameworks listés n'a de support intégré pour la mise à l'échelle automatique ; ce sont tous des frameworks de communication, vous devez donc faire le travail pour communiquer entre vos nœuds de mise à l'échelle. Cependant, Twisted a un avantage dans son support intégré pour le multi-processing local . En toute équité, il y a un module complémentaire tiers pour Tornado qui vous permet de faire la même chose. Dans les versions récentes, Twisted a ajouté des fonctionnalités qui augmentent le nombre de façons dont vous pouvez partager le travail entre les cœurs, et le travail est en cours dans ce domaine. Twisted a également un couple de bien intégré , "natif" Des protocoles RPC qui offrent un kit de construction pour tout idiome de mise à l'échelle que vous souhaitez poursuivre.

"Le plus utile"

Beaucoup de gens semblent trouver Twisted très utile . À tel point que nombre d'entre eux l'ont étendu et ont mis leurs extensions à votre disposition.

"Fonctionnalité"

Dans sa boîte, Twisted comprend :

Dans ce dernier domaine, au moins, Twisted semble être un vainqueur incontestable pour les fonctionnalités intégrées. Et tout cela, dans un paquet d'à peine plus de 2 mégaoctets !

48voto

Robert Zaremba Points 1925

J'aime la réponse de @Glyph. Twisted est un framework python très complet et riche. Twisted et Tornado ont un design très similaire. Et j'aime beaucoup ce design :

  • c'est rapide
  • facile à comprendre
  • facile à étendre
  • ne nécessite pas c-extensions
  • fonctionne sur PyPy.

Mais je veux souligner Tornade que je préfère et qui a récemment gagné en popularité. Tornado, comme Twisted, utilise une programmation de type callback, mais il peut être inlined en utilisant tornado.gen.engine ( twisted.internet.inlineCallbacks dans Twisted).

Codebase

Le meilleur commentaire est celui de http://cyclone.io site. cyclone essaie de mélanger Twisted et Tornado parce que :

Twisted est l'une des bibliothèques les plus matures pour les E/S non bloquantes disponibles au public. Tornado est la version open source du serveur web de FriendFeed, l'un des serveurs web les plus populaires et les plus rapides pour Python, avec une très une API très décente pour la création d'applications web.

L'idée est de relier l'API élégante et simple de Tornado à à l'Event-Loop de Twisted, permettant un grand nombre de protocoles supportés.

Mais en 2011 tornado.platform.twisted est sorti qui apporte une fonctionnalité similaire.

Performance

Tornado est bien meilleur performance . Il fonctionne également de manière transparente avec PyPy, et obtenir un gain énorme.

Évolutivité

La même chose que Twisted. Tornade a tornado.process et beaucoup de services rpc mis en œuvre par-dessus.

Fonctionnalité

Il y a 71 paquet basé sur Tornado, contre 148 Twisted et 48 Gevent. Mais si vous regardez attentivement et que vous calculez la médiane du temps de chargement des paquets, vous verrez que les paquets Twisted sont les plus anciens, puis Gevent et Tornado les plus récents. De plus, il y a tornado.platform.twisted qui vous permet de exécuter du code écrit pour Twisted sur Tornado .

Résumé

Avec Tornado, vous pouvez utiliser un code de Twisted. Il n'est pas nécessaire d'utiliser cyclone qui ne fait que torsades votre code (votre code devient plus désordonné).

J'ai écrit un article, expliquant pourquoi je considère que Tornado - le meilleur framework web en Python où j'ai écrit beaucoup plus sur la fonctionnalité de Tornado.

15voto

Erik Allik Points 9158

( UPDATE : Je suis tristement surpris du peu de réponses ici qui recommandent ou même mentionnent Gevent - je ne pense pas que ce soit proportionnel à la popularité, aux performances et à la facilité d'utilisation de cette excellente bibliothèque).

Gevent et Twisted ne sont pas mutuellement exclusifs, même si le contraire peut sembler évident au premier abord. Il existe un projet appelé geventreactor ce qui permet de tirer parti de manière relativement aisée du meilleur des deux mondes, à savoir :

  • Le modèle de threads efficace et bon marché (vert coopératif) de Gevent, qui est beaucoup plus facile à programmer lorsqu'il s'agit de concurrence - franchement, le modèle de threads de Twisted est plus efficace que celui de Gevent. inlineCallbacks n'est tout simplement pas à la hauteur en termes de performances lorsqu'il s'agit de nombreuses coroutines, ni en termes de facilité/transparence d'utilisation : yield y Deferreds partout ; il est souvent difficile de construire des abstractions ; des traces de pile horriblement inutiles avec les deux Deferred ainsi que, et encore plus avec @inlineCallbacks .
  • Toutes les fonctionnalités intégrées de Twisted dont vous pouvez rêver, y compris, mais sans s'y limiter, les suivantes IReactorProcess.spawnProcess .

Personnellement, j'utilise actuellement Gevent 1.0rc2 avec Twisted 12.3 bridgé par geventreactor . J'ai mis en œuvre mes propres ajouts et améliorations, non encore publiés, à l'égard de geventreactor que je publierai bientôt, en espérant qu'elle fasse partie de l'ouvrage geventreactor Le dépôt GitHub d'origine : https://github.com/jyio/geventreactor .

La disposition actuelle me permet de programmer dans le modèle de programmation agréable de Gevent et d'exploiter des éléments tels qu'un système non bloquant. socket , urllib2 et d'autres modules. Je peux utiliser du code Python normal pour faire des choses normales, contrairement à la courbe d'apprentissage et aux inconvénients de faire même des choses simples et basiques à la manière de Twisted. Je peux également utiliser facilement la plupart des bibliothèques tierces qui sont normalement soit hors de question avec Twisted, soit nécessitent l'utilisation de threads.

Je peux aussi éviter complètement la programmation maladroite et souvent trop complexe basée sur les rappels en utilisant des greenlets (au lieu de Deferred et les callbacks, et/ou @inlineCallbacks ).

(Cette réponse a été écrite sur la base de mes expériences personnelles, ayant utilisé à la fois Twisted et Gevent dans des projets réels, avec une expérience nettement plus importante avec Twisted (mais je ne prétends pas être un expert de Twisted). Les logiciels que j'ai eu à écrire n'ont pas eu à utiliser trop de fonctionnalités de Twisted, donc selon l'ensemble des fonctionnalités que vous exigez de Twisted, la complexité supplémentaire (relativement indolore) du mélange de Gevent et Twisted pourrait ne pas en valoir la peine).

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