Quand utiliser Tornado, quand utiliser Twisted / Cyclone / GEvent / autre [fermé]

181

Lequel de ces frameworks / bibliothèques serait le meilleur choix pour créer une application Web multi-utilisateurs moderne? J'adorerais avoir un serveur Web asynchrone qui me permettra d'évoluer facilement. Quelle solution offrira les meilleures performances / évolutivité / cadre le plus utile (en termes de facilité d'utilisation et de développement facile)?

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

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

Wojciech Danilo
la source
Doit-il être l'un de ces cadres? Que prévoyez-vous de faire et est-ce que quelque chose comme Django, Pylons, etc. pourrait fonctionner?
Joe Doherty
Non, bien sûr pas, mais j'aimerais bien qu'il soit asynchrone et qu'il ait un bon support pour les websockets - j'ai également mis à jour la question. Je vous remercie.
Wojciech Danilo
3
Une sorte de question générale, n'est-ce pas?
Jean-Paul Calderone
Votre choix dépend des bibliothèques que vous souhaitez utiliser. Vos bibliothèques - sur la tâche, que vous voulez résoudre.
Nikolay Fominyh
1
Oui, il est large, mais peut-être olvable. Je me demande si ces bibliothèques sont utilisées en production et si quelqu'un, qui en utilise certains tous les jours, est capable de dire à quoi elles servent, ce qui leur manque, etc. Quelle devrait être la base pour choisir une bibliothèque - peut-être que Twisted devrait être considéré déprécié quand on parle d’autoroute ou de cyclone? Ou bien MMaybe Autobahn et Cyclone ne sont pas prêts pour la production et son entretien est remis en question? Ou peut-être que Tornado a un design plus moderne et que son avenir sera probablement brillant et génial et devrait être LE choix pour un projet de démarrage?
Wojciech Danilo

Réponses:

226

" Django est un framework Web Python de haut niveau qui encourage un développement rapide et une conception propre et pragmatique" . Si vous créez quelque chose qui ressemble à un site de commerce électronique, vous devriez probablement utiliser Django. Votre travail sera effectué rapidement. Vous n'avez pas à vous soucier d'un trop grand nombre de choix technologiques. Il fournit tout ce dont vous avez besoin, du moteur de modèle à l'ORM. Il sera légèrement avisé de la façon dont vous structurez votre application, ce qui est bien si vous me le demandez. Et il a la communauté la plus forte de toutes les autres bibliothèques, ce qui signifie qu'une aide facile est disponible.

" Flask est un microframework pour Python basé sur Werkzeug, Jinja 2 et de bonnes intentions" . Attention, le "microframework" peut être trompeur. Cela ne signifie pas que Flask est une bibliothèque à moitié cuite. Cela signifie que le noyau du flacon 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 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. Autant que je sache, Flask est utile pour écrire des points de terminaison d'API (services RESTful).

" Twisted est un moteur de réseautage événementiel écrit en python" . C'est un moteur performant. La raison principale de sa vitesse est quelque chose appelé comme différé. Twisted est construit sur les différés. Pour ceux d'entre vous qui ne connaissent pas les différés, c'est le mécanisme à travers l'architecture asynchrone qui est atteint. 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, tordu est votre ami.

« Tornado est un framework Web Python et une bibliothèque de mise en réseau asynchrone, initialement développés chez FriendFeed. En utilisant des E / S réseau non bloquantes, Tornado peut évoluer jusqu'à des dizaines de milliers de connexions ouvertes, ce qui le rend idéal pour les longues interrogations, les WebSockets et d'autres applications qui nécessitent une connexion de longue durée à chaque utilisateur " . Tornado se trouve quelque part entre Django et Flask. Si vous souhaitez é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 du C10k s'il est correctement 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 soit presque aussi performant que Twisted mais facile à écrire des applications Web conventionnelles? Dites bonjour au cyclone. Je préférerais Cyclone à Tornado. Il possède une API très similaire à Tornado. En fait, c'est une fourchette de Tornado. Mais le problème est que la communauté est relativement petite. Alexandre Fiori est le seul principal engagement du repo.

« Pyramid est un cadre général de développement d'applications Web Python open source. 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 je comprends, Pyramid est très similaire à Flask et je pense que vous pouvez utiliser Pyramid partout où Flask semble approprié et vice-versa.

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

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

dhilipsiva
la source
1
Django est mon framework préféré. Sa documentation est très bonne et l'ORM est facile. South est idéal pour les migrations de schémas de bases de données ... Mais la question contenait ceci: "J'adorerais avoir un serveur web asynchrone qui me permettra d'évoluer facilement.". Django a été conçu pour les sites classiques de requête + réponse, pas pour l'asynchrone.
guettli
1
Pouvez-vous écrire sur Pyramid?
Fizer Khan
5
@FizerKhan: Selon votre demande, j'ai mis à jour la réponse. Désolé, cela a pris si longtemps. Je n'ai pas eu le temps d'utiliser Pyramid. Mais j'ai parcouru la documentation.
dhilipsiva
1
J'ajouterais que l'environnement à un seul thread utilisé par Tornado est beaucoup plus sujet aux bogues - une erreur qui ralentit le code d'un seul point de terminaison d'API causera facilement des problèmes pour tous les points de terminaison.
Abel Molina
1
Pourriez-vous faire un commentaire sur cherrypy?
Stavros Avramidis
60

C'est évidemment une réponse quelque peu biaisée , mais ce n'est pas la même chose qu'une mauvaise réponse; vous devez toujours utiliser Twisted. J'ai déjà répondu à des 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 speed.twistedmatrix.com . Nous avons également été l'un des premiers projets à être surveillé par le site similaire de PyPy , assurant ainsi les bonnes performances de Twisted sur le runtime que toute personne concernée par des applications haute performance en Python.

"Évolutivité"

À ma connaissance, aucun des frameworks répertorié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 sa prise en charge intégrée du multi-traitement local . Pour être honnête, il existe 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 deux bien intégrés , « natifs » protocoles RPC qui offrent un kit de construction pour quelque idiome mise à l' échelle que vous voulez poursuivre.

"Le plus utile"

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

"Fonctionnalité"

Hors de la boîte, Twisted comprend:

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

Glyphe
la source
6
pourquoi tant de gens disent qu'ils n'utilisent plus Twisted, mais GEvent?
remdezx
1
Il y a beaucoup de gens qui disent qu'il est difficile de maintenir de grosses applications en utilisant Twisted (en raison de son architecture de rappel): stackoverflow.com/questions/3048012/... Ne serait-il pas préférable d'utiliser gevent ou gevent basé sur Twisted?
Wojciech Danilo
8
@remdezx Quant à votre question, il y a deux raisons. La première est que les gens trouvent Twisted difficile à comprendre parce que la programmation simultanée est difficile à comprendre. Ils passent ensuite à GEvent car il est superficiellement facile à comprendre - tant qu'il n'y a pas de concurrence, tout fonctionne comme vous vous y attendiez. L'autre raison est qu'il faut beaucoup moins de travail pour porter du code vers GEvent qui n'a pas été écrit à l'aide d'une API événementielle pour obtenir les avantages des performances des E / S événementielles. Si votre code ne partage pas trop d'état, un tel port fonctionne probablement très bien.
Glyph
1
@Glyph, vous parlez de concurrence, mais ... ni Gevent ni Twisted ne prennent en charge la concurrence (bien sûr, vous pouvez utiliser le multitraitement avec gevent et utiliser un pool de vrais threads et un pool de greenlets sur chaque thread - ce qui fonctionne bien pour moi et vous pouvez utiliser le plugin Twisted pour faire exactement la même chose - exécuter plusieurs entrées torsadées les unes à côté des autres). Mais est-ce que Twisted vous donne quelque chose de plus que Gevent? Je pense que même avec plusieurs instances de gevent / twisted, gevent est plus facile à comprendre et sans ses rappels explicite io. Est-ce que je manque quelque chose?
Wojciech Danilo
2
@ danilo2 Oui, il vous manque au moins une chose :). Plus précisément, vous comprenez mal le mot «concurrence» comme signifiant «exécution parallèle simultanée sur plusieurs processeurs». Twisted peut effectuer une planification d'E / S simultanées via des E / S asynchrones (basées sur le rappel). GEvent peut effectuer une planification des E / S simultanées via un programmateur micro-thread. Dans Twisted, en utilisant spawnProcess, cette planification d'E / S peut également être traduite en planification CPU.
Glyph
48

J'aime la réponse @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 d' extensions c
  • fonctionne sur PyPy.

Mais je veux souligner Tornado , que je préfère et qui a récemment gagné en popularité. Tornado, comme Twisted, utilise une programmation de style callback, mais elle peut être intégrée en utilisant tornado.gen.engine( twisted.internet.inlineCallbacksdans Twisted).

Base de code

Le meilleur commentaire vient du site http://cyclone.io . 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 API très décente pour créer des applications Web.

L'idée est de relier l'API élégante et simple de Tornado à la boucle d'événement de Twisted, permettant ainsi un grand nombre de protocoles pris en charge.

Mais en 2011 tornado.platform.twistedétait sorti ce qui apporte des fonctionnalités similaires.

Performance

Tornado a de bien meilleures performances . Il fonctionne également de manière transparente avec PyPy et obtient un gain énorme.

Évolutivité

La même chose que Twisted. Tornado a tornado.processmis en œuvre de nombreux services RPC en plus.

Fonctionnalité

Il existe 71 packages basés sur Tornado, contre 148 Twisted et 48 Gevent. Mais si vous regardez attentivement et calculez la médiane du temps de téléchargement des paquets, vous verrez que les Twisted sont les plus anciens, puis Gevent et Tornado les plus récents. De plus, il existe un tornado.platform.twistedmodule qui vous permet d' exécuter du code écrit pour Twisted on Tornado .

Résumé

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 désordonné).

Quant à 2014, Tornado est considéré comme un framework async par défaut largement accepté 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 je considère que Tornado - le meilleur framework Web Python où j'ai écrit beaucoup plus sur les fonctionnalités de Tornado.

Robert Zaremba
la source
15

( MISE À JOUR : je suis tristement surpris du peu de réponses ici 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é geventreactorqui permet de tirer parti du meilleur des deux mondes de manière relativement fluide, à savoir:

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

J'utilise personnellement Gevent 1.0rc2 avec Twisted 12.3 ponté par geventreactor. J'ai implémenté mes propres ajouts et améliorations non encore publiés geventreactorque je publierai bientôt, avec un peu de chance dans le cadre du geventreactordépôt GitHub original de: https://github.com/jyio/geventreactor .

Ma disposition actuelle me permet de programmer dans le joli modèle de programmation de Gevent, et de tirer parti de choses telles qu'un non-bloquant socket, urllib2et d'autres modules. Je peux utiliser du code Python ordinaire pour faire des choses régulières, par opposition à la courbe d'apprentissage et à l'inconvénient de faire même des choses simples et basiques à la manière Twisted. Je peux également 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 basée sur les callbacks maladroite et souvent trop complexe en utilisant des greenlets (au lieu de Deferreds et de callbacks, et / ou @inlineCallbacks).

(Cette réponse a été rédigée sur la base de mes expériences personnelles ayant utilisé à la fois Twisted et Gevent dans des projets réels, avec beaucoup plus d'expérience en utilisant Twisted (mais je ne prétends pas être un expert de Twisted). Le logiciel que j'ai dû écrire n'a pas Vous n'avez pas eu à utiliser trop de fonctionnalités de Twisted, donc selon l'ensemble de fonctionnalités dont vous avez besoin de Twisted, la complexité supplémentaire (relativement indolore) du mélange de Gevent et de Twisted ne vaut peut-être pas la peine.)

Erik Kaplun
la source