web-dev-qa-db-fra.com

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

Lequel de ces frameworks/bibliothèques serait le meilleur choix pour la construction d'applications Web multi-utilisateurs modernes? J'adorerais avoir un serveur web asynchrone qui me permettra d'évoluer facilement. Quelle solution donnera le meilleure performance/évolutivité/cadre le plus utile (en termes de facilité d'utilisation et de développement)?

Ce serait formidable si cela fournira une bonne fonctionnalité (websockets, RPC, streaming, etc.).

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

180
Wojciech Danilo

"Django est un cadre Web Python de haut niveau qui encourage développement rapide et conception propre et pragmatique ". Si vous construisez quelque chose qui ressemble à un site de commerce électronique, vous devriez probablement choisir Django. Votre travail sera fait rapidement. Vous n'avez pas à vous soucier de trop de choix technologiques. Il fournit tout ce dont vous avez besoin, du moteur de gabarit à ORM. Il y aura une légère opinion sur la façon dont vous structurez votre application, ce qui est bien si vous me le demandez. Et c'est la communauté la plus puissante parmi toutes les autres bibliothèques, ce qui signifie qu'une aide simple est disponible.

"Flask est un microframework pour Python basé sur Werkzeug, Jinja 2 et bonnes intentions ". Attention - "microframework" peut être trompeur. Cela ne signifie pas que Flask est une bibliothèque à moitié cuite. Cela signifie que le noyau de flask est très très simple. Contrairement à Django, il ne prendra aucune décision technologique à votre place. Vous êtes libre de choisir n'importe quel moteur de template ou ORM qui vous plaira. Même s'il est livré avec le moteur de template Jinja par défaut, vous êtes toujours libre de choisir le nôtre. Autant que je sache, Flask est très utile pour l'écriture de points de terminaison d'API (services RESTful).

"Twisted est un moteur de réseau géré par événement écrit en python" . C'est un moteur performant. La raison principale de sa rapidité est ce que l’on appelle différé. Twisted est construit sur les différés. Pour ceux d’entre vous qui ne connaissent pas les reports, c’est le mécanisme qui permet de réaliser une architecture asynchrone. Twisted est très rapide. Mais ne convient pas à l'écriture d'applications Web conventionnelles. Si vous voulez faire quelque chose de réseautage de bas niveau, Twist est votre ami.

"Tornado est un cadre Web Python et une bibliothèque réseau asynchrone, Tornado peut s’adapter à des dizaines de milliers de connexions ouvertes en utilisant des E/S réseau non bloquantes, ce qui le rend idéal pour les longues interrogations, les WebSockets et autres applications nécessitant une connexion longue durée à chaque utilisateur ". La tornade se situe entre Django et Flask. Si vous voulez écrire quelque chose avec Django ou Flask, mais si vous avez besoin de meilleures performances, vous pouvez opter pour Tornado. il peut très bien gérer le problème C10k s’il est correctement conçu.

"Cyclone est un framework de serveur Web pour Python qui implémente le API Tornado en tant que protocole Twisted ". Maintenant, que se passe-t-il si vous voulez quelque chose qui est presque aussi performant que Twisted mais facile à écrire des webapps conventionnelles? Dites bonjour au cyclone. Je préférerais Cyclone à Tornado. Son API est très similaire à Tornado. En fait, il s’agit d’une fourchette de Tornado. Mais le problème est que sa communauté est relativement petite. Alexandre Fiori est le seul responsable principal du repo.

"Pyramid est une application open source générale, Python web. développement. 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 à Flask et je pense que vous pouvez utiliser Pyramid partout . Flask semble approprié et inversement. .

EDIT: les demandes de révision d'autres cadres sont les bienvenues!

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

217
dhilipsiva

Ceci est évidemment une réponse n peu biaisée , mais ce n'est pas la même chose qu'une réponse mauvaise ; vous devriez toujours utiliser Twisted. J'ai déjà répondu questions similaires , mais comme votre question n'est pas tout à fait la même, voici quelques raisons:

"Meilleure performance"

Twisted surveille en permanence nos performances sur le site Web speed.twistedmatrix.com . Nous étions également l'un des premiers projets à surveiller par le site similaire de PyPy , garantissant ainsi la bonne performance de Twisted au moment de l'exécution que quiconque est concerné par les applications hautes performances en Python.

"Evolutivité"

À ma connaissance, aucun des frameworks listés ne prend en charge la mise à l'échelle automatique; Ce sont tous des cadres 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 multitraitement local . En toute justice, il y a n tiers add-on 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 de partager le travail entre les cœurs, travail en cours dans ce domaine. Twisted a également quelques protocoles RPC bien intégrés , "natifs" qui offrent un kit de construction pour l’idiot de redimensionnement que vous souhaitez utiliser.

"Le plus utile"

Beaucoup de gens semblent trouver Twisted très utile . Si bien que beaucoup d’entre eux l’ont étendu et mis à leur disposition.

"Fonctionnalité"

Hors de la boîte, Twisted comprend:

Dans ce dernier département, au moins, Twisted semble être un gagnant clair pour la fonctionnalité intégrée. Et tout cela, dans un package d'un peu plus de 2 mégaoctets!

57
Glyph

J'aime la réponse @Glyph. Twisted est très complet, riche python framework. 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 tiens à souligner Tornado , que je préfère et qui a récemment gagné en popularité. Tornado, comme Twisted, utilise une programmation de style rappel, mais il peut être inséré à l’aide de tornado.gen.engine (twisted.internet.inlineCallbacks dans Twisted).

Base de code

Le meilleur commentaire provient du site http://cyclone.io . cyclone tente de mélanger Twisted et Tornado car:

Twisted est l’une des bibliothèques les plus abouties 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 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 à Event-Loop de Twisted, permettant ainsi un grand nombre de protocoles pris en charge.

Mais en 2011, tornado.platform.twisted était sorti, offrant des fonctionnalités similaires.

Performance

La tornade a beaucoup mieux performance . Il fonctionne également de manière transparente avec PyPy et procure un gain énorme.

L'évolutivité

Le même comme Twisted. Tornado a tornado.process et de nombreux services RPC sont implémentés.

Fonctionnalité

Il y en a 71 Paquet basé sur Tornado, comparé à 148 Twisted et 48 Gevent. Mais si vous regardez attentivement et calculez la médiane du temps de chargement des paquets, vous verrez que ceux qui sont à torsion sont les plus anciens, puis ceux de Gevent et Tornado qui sont les plus frais. En outre, il existe un module tornado.platform.twisted qui vous permet d'exécuter du code écrit pour Twisted sur Tornado .

Sommaire

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

En ce qui concerne 2014, Tornado est considéré comme un framework asynchrone largement accepté et qui fonctionne à la fois sur python2 et python3. De plus, la dernière version 4.x apporte de nombreuses fonctionnalités de https://docs.python.org/dev/library/asyncio.html .

J'ai écrit un article expliquant pourquoi j'estime que Tornado - le meilleur Python framework Web) où j'ai beaucoup plus écrit sur les fonctionnalités de Tornado.

47
Robert Zaremba

(UPDATE: Je suis malheureusement étonné de constater que peu de réponses recommandent ou même mentionnent Gevent. Je ne pense pas que cela soit à la mesure de la popularité. , performance et facilité d’utilisation de cette excellente bibliothèque!)

Gevent et Twisted ne s'excluent pas mutuellement, même si le contraire peut sembler évident au premier abord. Il existe un projet appelé geventreactor qui permet de tirer parti en douceur du meilleur des deux mondes, à savoir:

  • Le modèle de thread efficace et bon marché (vert coopératif) de Gevent, qui est beaucoup plus facile à programmer en ce qui concerne la simultanéité — franchement, le inlineCallbacks de Twisted n’est tout simplement pas à la hauteur en termes de performances pour de nombreuses coroutines, et aucun en termes de facilité/transparence d'utilisation: yield et Deferreds partout; souvent difficile de construire des abstractions; des traces de pile horriblement inutiles avec à la fois Deferreds 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, IReactorProcess.spawnProcess.

Personnellement, j'utilise actuellement Gevent 1.0rc2 avec Twisted 12.3 ponté par geventreactor. J'ai implémenté mes propres ajouts et améliorations non encore publiés à geventreactor que je publierai bientôt, dans le cadre du référentiel GitHub original de geventreactor: https://github.com/jyio/geventreactor .

Ma structure actuelle me permet de programmer dans le modèle de programmation Nice de Gevent et de tirer parti d'éléments tels qu'un socket non bloquant, urllib2 et d'autres modules. Je peux utiliser le code Python normal pour faire des choses normales, par opposition à la courbe d'apprentissage et aux inconvénients de faire même des choses simples et élémentaires à la manière Twisted. Je peux aussi facilement utiliser la plupart des bibliothèques tierces qui sont normalement soit hors de question avec Twisted, soit nécessitent l’utilisation de threads.

Je peux également éviter complètement la programmation complexe basée sur les rappels, qui est délicate et souvent trop complexe, en utilisant des greenlets (au lieu de Deferreds et callbacks et/ou @inlineCallbacks).

(Cette réponse a été écrite sur la base de mon expérience personnelle, avec l'utilisation à la fois de Twisted et de Gevent dans des projets concrets, avec beaucoup plus d'expérience d'utilisation de Twisted (mais je ne prétends pas être un expert de Twisted). Le logiciel que j'ai eu à écrire Il n’est pas nécessaire d’utiliser trop de fonctionnalités de Twisted. Par conséquent, en fonction de l’ensemble des fonctionnalités dont vous avez besoin, la complexité supplémentaire (relativement simple) du mélange entre Gevent et Twisted pourrait ne pas valoir la peine.)

15
Erik Allik