Quand utiliser Tornado, quand utiliser Twisted / Cyclone / GEvent / other [fermé]
lequel de ces cadres / bibliothèques serait le meilleur choix pour construire une application web multi-utilisateurs moderne? J'aimerais avoir un serveur asynchrone qui me permettra d'échelle facile. Quelle solution donnera la meilleure performance / évolutivité / cadre le plus utile (en termes de facilité d'utilisation et facile de développement)?
il serait grand si elle fournira de bonnes "151910920 de" fonctionnalité (websockets, rpc, streaming, etc).
Quels sont les avantages et les inconvénients de chaque solution?
4 réponses
" Django est un cadre Web Python de haut niveau qui encourage le développement rapide et un design propre et pragmatique" . Si vous construisez quelque chose qui ressemble à un site de commerce électronique, alors vous devriez probablement aller avec Django. Cela vous permettra de faire 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èle à ORM. Il sera légèrement opinions sur la façon de structurer votre application, ce qui est bon Si vous me demandez. Et il a la communauté la plus forte de toutes les autres bibliothèques, ce qui signifie que l'aide facile est disponible.
" Flask est un microfram Framework pour Python basé sur Werkzeug, Jinja 2 et de bonnes intentions" . Attention - "microfram Framework" may be misleading. Cela ne signifie pas que le flacon est une bibliothèque à moitié cuit. Cela signifie le noyau de la fiole 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 Jinja template par défaut, vous êtes toujours libre de choisir le nôtre. Pour autant que je sache, Flask est pratique pour écrire des paramètres APIs (RESTful services).
" Twisted est un moteur de réseau piloté par un événement écrit en python" . C'est un moteur de haute performance. La raison principale de sa vitesse est quelque chose appelé comme différé. Twisted est construit sur des déférements. Pour ceux d'entre vous qui ne savent pas au sujet de defereds, c'est le mécanisme à travers l'architecture asynchrone est atteint. Twisted est très rapide. Mais n'est pas adapté à l'écriture webapps conventionnels. Si vous voulez faire quelque chose de bas niveau, twisted est votre ami.
" Tornado est un framework web Python et une bibliothèque de réseau asynchrone, développé à L'origine chez FriendFeed. En utilisant l'E/S réseau non-bloquant, Tornado peut passer à des dizaines de milliers de connexions ouvertes, ce qui le rend idéal pour les longs sondages, WebSockets, et d'autres applications qui exigent une connexion de longue durée à chaque utilisateur" . Entre Django et flasque, il y a une tornade. Si vous voulez écrire quelque chose avec Django ou flasque, mais si vous avez besoin d'un meilleur performance, vous pouvez opter pour Tornado. il peut gérer très bien le problème C10k s'il est bien construit.
" Cyclone est un framework de serveur web pour Python qui implémente L'API Tornado comme un protocole tordu" . Maintenant, que faire si vous voulez quelque chose qui est presque aussi performant que Twisted mais facile à écrire webapps conventionnels? Dis bonjour au cyclone. Je préférerais un Cyclone à une tornade. Il a une API C'est très similaire à Tornado. En fait, c'est une fourchette de tornade. Mais le problème est qu'elle a une communauté relativement petite. Alexandre Fiori est le seul grand commettant du repo.
" Pyramid est un cadre général de développement D'applications Web Python open source. Son but premier est de faciliter la création d'applications web par un développeur Python." Je n'ai pas vraiment utilisé Pyramid, mais je suis allé à travers la documentation. De ce que je comprends, pyramide est très similaire à flacon et je pense que vous pouvez utiliser pyramide partout flacon semble approprié et vice-versa.
EDIT : toute demande de révision de tout autre cadre est la bienvenue!
c'est évidemment une réponse quelque peu biaisée , mais ce n'est pas la même chose qu'une réponse fausse ; vous devriez toujours utiliser Twisted. J'ai déjà répondu à des questions similaires , mais puisque votre question n'est pas tout à fait la même, voici quelques raisons:
"Meilleure Performance "
Twisted surveille en continu nos performances au speed.twistedmatrix.com site web. Nous avons également été l'un des premiers projets à être suivi par le site similaire de PyPy , assurant ainsi la bonne performance de Twisted à l'exécution que toute personne concernée par les applications haute performance en Python.
"évolutivité "
à ma connaissance, aucun des cadres énumérés n'a de support intégré pour l'échelle automatique; ils sont tous des cadres de communication, donc vous devez faire le travail pour communiquer entre vos noeuds de mise à l'échelle. Cependant, Twisted a un avantage dans son support intégré pour le multi-traitement local . En toute justice, il y a un add-on 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 de partager le travail entre les cœurs, et les travaux se poursuivent dans ce domaine. Twisted a aussi un couple de bien intégré , " natif " les protocoles RPC qui offrent une construction-kit pour n'importe quel langage de mise à l'échelle que vous voulez poursuivre.
"Très Utile "
Beaucoup de gens semblent trouver Tordu", 1519350920" très utile . tant et Si bien que beaucoup d'entre eux ont étendu et leurs extensions disponibles pour vous.
" fonctionnalité"
sortie de la boîte, tordue comprend:
- un bon soutien pour le développement piloté par les tests de toutes les
- TCP serveurs, clients , transport layer security
- SSH client et serveur
- IMAP4, ESMTP, POP3 les clients et les serveurs
- DNS client et serveur
- HTTP client et serveur
- IRC, XMPP, OSCAR, MSN clients et serveurs
dans ce dernier département, au moins, Twisted semble un gagnant clair pour la fonctionnalité intégrée. Et tout cela, dans un paquet d'un peu plus de 2 mégaoctets!
tornado.gen.engine
( twisted.internet.inlineCallbacks
dans Twisted).
Codebase
le meilleur commentaire est de http://cyclone.io site. cyclone tente de mélanger tordue et Tornade parce que:
Tordu est l'un des plus bibliothèques matures pour les e/s non bloquantes disponibles à la public. Tornado est la version open source du serveur web D'FriendFeed, un des serveurs web les plus populaires et rapides pour Python, avec un API décent pour la construction d'applications web.
l'idée est de combler L'élégante et simple API Tornado pour La boucle D'événements de Twisted, permettant un grand nombre de protocoles pris en charge.
mais en 2011 tornado.platform.twisted
était sorti apporte des fonctionnalités similaires.
Performance
Tornade a beaucoup mieux performance . Il fonctionne également de façon transparente avec PyPy, et obtenir un gain énorme.
évolutivité
la même chose que Twisted. Tornado a tornado.process
et beaucoup de services rpc mis en œuvre en plus de celui-ci.
fonctionnalité
il y a 71 Paquet basé sur la tornade, comparé à 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 paquets tordus sont les plus anciens, puis Gevent et Tornado les plus frais.
En outre, il ya tornado.platform.twisted
module qui vous permet de run 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 le cyclone qui seulement twists votre code (votre code devient plus embrouillé).
quant à 2014, Tornado est considéré comme largement accepté et par défaut async framework qui fonctionne à la fois sur python2 et python3. Aussi la dernière version 4.x apporte beaucoup de fonctionnalités de https://docs.python.org/dev/library/asyncio.html .
j'ai écrit un article, expliquant pourquoi je considère que tornade - Le Meilleur Python web framework où j'ai écrit beaucoup plus sur la fonctionnalité Tornado.
( UPDATE : je suis tristement surpris de voir que peu de réponses ici recommandent ou même mentionnent Gevent-Je ne pense pas que ce soit proportionnel à la popularité, la performance et la facilité d'utilisation de cette excellente bibliothèque!)
Gevent et Twisted ne s'excluent pas mutuellement, même si le contraire peut sembler évident à première vue. Il existe un projet appelé geventreactor
qui permet de tirer relativement facilement parti du meilleur des deux mondes, à savoir:
- efficace et pas cher (coopérative vert) modèle de thread de Gevent, qui est beaucoup plus facile à programmer quand il s'agit de la simultanéité-franchement, Tordu
inlineCallbacks
est tout simplement pas à la hauteur de la tâche en termes de performances quand il s'agit de beaucoup de coroutines, et ni en termes de facilité/la transparence de l'utilisation:yield
etDeferreds
partout; souvent difficile de construire des abstractions; horriblement inutiles, les traces de pile avec les deux nusDeferred
s ainsi comme, et encore plus avec@inlineCallbacks
. - Toutes les fonctionnalités intégrées de Tordu, vous pouvez toujours rêver, y compris, mais non limité à
IReactorProcess.spawnProcess
.
j'utilise personnellement Gevent 1.0rc2 avec Torsadé 12.3 ponté par geventreactor
. J'ai mis en place mes propres ajouts et améliorations non encore publiés à geventreactor
que je publierai bientôt, avec un peu de chance dans le cadre du dépôt original Github de geventreactor
: https://github.com/jyio/geventreactor .
ma mise en page actuelle me permet de programmer dans le modèle de programmation nice de Gevent, et de tirer parti de choses comme un non-blocage socket
, urllib2
et d'autres modules. Je peux utiliser le code Python régulier 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 de façon détournée. Je peux aussi facilement utiliser la plupart des bibliothèques de tiers qui sont normalement soit hors de question Tordues, ou exiger l'utilisation de threads.
je peux aussi éviter complètement la programmation basée sur des appels maladroits et souvent trop complexes en utilisant des greenlets (au lieu de Deferred
et des callbacks, et/ou @inlineCallbacks
).
(cette réponse a été écrite sur la base de mes expériences personnelles ayant utilisé Twisted et Gevent dans des projets de la vie réelle, avec beaucoup plus d'expérience en utilisant Twisted (mais je ne prétends pas être un Twisted expert.) Le logiciel que j'ai eu à écrire n'a pas eu à utiliser trop de fonctionnalités de Twisted, donc en fonction de l'ensemble des fonctionnalités que vous exigez de Twisted, la (relativement indolore) complexité supplémentaire de mélanger Gevent et Twisted pourrait ne pas valoir le coup.)