Quando usare Tornado, quando usare Twisted / Cyclone / GEvent / other [chiuso]


181

Quale di questi framework / librerie sarebbe la scelta migliore per la creazione di moderne applicazioni web multiutente? Mi piacerebbe avere un server web asincrono che mi permetterà di scalare facilmente. Quale soluzione fornirà le migliori prestazioni / scalabilità / quadro più utile (in termini di facilità d'uso e facilità di sviluppo)?

Sarebbe bello se fornirà una buona funzionalità (websocket, rpc, streaming, ecc.).

Quali sono i pro e i contro di ogni soluzione?


Deve essere uno di questi quadri? Che cosa hai intenzione di fare e potrebbe funzionare qualcosa come Django, Pylons, ecc ...?
Joe Doherty,

No, ovviamente no, ma mi piacerebbe che fosse asincrono e avrebbe un buon supporto per i websocket - Ho aggiornato anche la domanda. Grazie.
Wojciech Danilo,

3
Una specie di domanda ampia, no?
Jean-Paul Calderone,

La scelta dipende dalle librerie che si desidera utilizzare. Le tue librerie - su compito, che vuoi risolvere.
Nikolay Fominyh,

1
Sì, è ampio, ma forse olvabile. Mi chiedo se queste librerie siano utilizzate nella produzione e qualcuno, che ne sta usando alcune ogni giorno, è in grado di dire per cosa sono ottime, per cosa mancano, ecc. Quale dovrebbe essere la base per scegliere una libreria - forse Twisted dovrebbe essere considerato deprezzato quando si parla di Autobahn o Cyclone? O mmaybe Autobahn e Cyclone non sono pronti per la produzione e la sua manutenzione è in discussione? O forse Tornado ha un design più moderno e il suo futuro sarà probabilmente brillante e fantastico e dovrebbe essere LA scelta per il progetto di avvio?
Wojciech Danilo,

Risposte:


226

" Django è un framework Python Web di alto livello che incoraggia lo sviluppo rapido e un design pulito e pragmatico" . Se stai costruendo qualcosa di simile a un sito di e-commerce, probabilmente dovresti andare con Django. Il tuo lavoro sarà svolto rapidamente. Non devi preoccuparti di troppe scelte tecnologiche. Fornisce tutto ciò di cui hai bisogno, dal template engine all'ORM. Sarà leggermente supponente sul modo in cui strutturi la tua app, il che è positivo se me lo chiedi. E ha la community più forte di tutte le altre librerie, il che significa che è disponibile un facile aiuto.

" Flask è una microfotografia per Python basata su Werkzeug, Jinja 2 e buone intenzioni" . Attenzione: "microframework" potrebbe essere fuorviante. Ciò non significa che Flask sia una libreria semicotta. Ciò significa che il nucleo del pallone è molto, molto semplice. A differenza di Django, non prenderà alcuna decisione tecnologica per te. Sei libero di scegliere qualsiasi motore modello o ORM che ti piace. Anche se viene fornito con il motore di template Jinja per impostazione predefinita, sei sempre libero di scegliere il nostro. Per quanto ne so, Flask è utile per scrivere endpoint API (servizi RESTful).

" Twisted è un motore di rete basato sugli eventi scritto in Python" . Questo è un motore ad alte prestazioni. Il motivo principale della sua velocità è qualcosa chiamato differito. Twisted è costruito in cima ai differiti. Per quelli di voi che non conoscono i differiti, si ottiene il meccanismo attraverso l'architettura asincrona. Twisted è molto veloce. Ma non è adatto per la scrittura di webapp convenzionali. Se vuoi fare qualcosa di networking di basso livello, il tuo amico è contorto.

" Tornado è un framework Web Python e una libreria di rete asincrona, originariamente sviluppata in FriendFeed. Utilizzando l'I / O di rete non bloccante, Tornado può ridimensionare fino a decine di migliaia di connessioni aperte, rendendolo ideale per polling lunghi, WebSocket e altre applicazioni che richiedono una connessione di lunga durata per ciascun utente " . Il tornado si trova tra Django e Flask. Se vuoi scrivere qualcosa con Django o Flask, ma se hai bisogno di prestazioni migliori, puoi optare per Tornado. può gestire molto bene il problema C10k se è progettato correttamente.

" Cyclone è un framework di web server per Python che implementa l'API Tornado come protocollo Twisted" . E se volessi qualcosa di quasi performante come Twisted ma facile da scrivere webapp convenzionali? Saluta il ciclone. Preferirei il ciclone al tornado. Ha un'API molto simile a Tornado. È un dato di fatto, questo è un fork di Tornado. Ma il problema è che ha una comunità relativamente piccola. Alexandre Fiori è l'unico committente principale del repository.

" Pyramid è un framework di sviluppo di applicazioni Web Python generale e open source. Il suo obiettivo principale è quello di rendere più semplice per gli sviluppatori Python la creazione di applicazioni Web." Non ho davvero usato Pyramid, ma ho esaminato la documentazione. Da quanto ho capito, Pyramid è molto simile a Flask e penso che tu possa usare Pyramid ovunque Flask sembri appropriato e viceversa.

EDIT : la richiesta di revisione di qualsiasi altro framework è benvenuta!

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


1
Django è il mio framework preferito. La sua documentazione è molto buona e l'ORM è semplice. Il sud è ottimo per le migrazioni degli schemi di database .... Ma la domanda conteneva questo: "Mi piacerebbe avere un server web asincrono che mi permetta di scalare facilmente". Django è stato creato per i siti di richiesta + risposta classici, non per quelli asincroni.
Guettli,

1
Puoi scrivere su Pyramid?
Fizer Khan,

5
@FizerKhan: secondo la tua richiesta, ho aggiornato la risposta. Mi dispiace che ci sia voluto così tanto. Non ho avuto il tempo di usare Pyramid. Ma ho esaminato la documentazione.
dhilipsiva,

1
Aggiungo che l'ambiente a thread singolo utilizzato da Tornado è molto più soggetto a bug: un errore che rallenta il codice di un singolo endpoint API causerà facilmente problemi per tutti gli endpoint.
Abel Molina,

1
Potresti fare un commento su Cherrypy?
Stavros Avramidis,

60

Questa è ovviamente una risposta in qualche modo distorta , ma non è la stessa cosa di una risposta sbagliata ; dovresti sempre usare Twisted. Ho già risposto a domande simili prima, ma poiché la tua domanda non è esattamente la stessa, ecco alcuni motivi:

"La prestazione migliore"

Twisted monitora costantemente le nostre prestazioni sul sito Web speed.twistedmatrix.com . Siamo stati anche uno dei primi progetti a essere monitorati dal sito simile di PyPy , assicurando così le buone prestazioni di Twisted in fase di esecuzione di chiunque fosse interessato ad applicazioni ad alte prestazioni in Python.

"Scalabilità"

Per quanto ne so, nessuno dei framework elencati ha alcun supporto integrato per il ridimensionamento automatico; sono tutti framework di comunicazione, quindi devi fare il lavoro per comunicare tra i tuoi nodi di ridimensionamento. Tuttavia, Twisted ha un vantaggio nel suo supporto integrato per la multi-elaborazione locale . In tutta onestà, esiste un componente aggiuntivo di terze parti per Tornado che ti consente di fare la stessa cosa. Nelle versioni recenti, Twisted ha aggiunto funzionalità che aumentano il numero di modi in cui è possibile condividere il lavoro tra i core e il lavoro è in corso in quell'area. Ritorto ha anche un paio di ben integrati , "nativi" protocolli RPC, che offrono una costruzione-kit per qualsiasi linguaggio di scala che si desidera perseguire.

"Il più utile"

Molte persone sembrano trovare Twisted molto utile . Tant'è che molti di loro l'hanno esteso e reso disponibili le loro estensioni.

"Funzionalità"

Out of the box, Twisted include:

In quest'ultimo dipartimento, almeno, Twisted sembra un chiaro vincitore per la funzionalità integrata. E tutto questo, in un pacchetto di poco più di 2 megabyte!


6
perché così tante persone dicono che non usano più Twisted, ma GEvent?
remdezx,

1
Ci sono molte persone che dicono che è difficile mantenere grandi applicazioni usando Twisted (a causa della sua architettura di callback): stackoverflow.com/questions/3048012/… Non sarebbe meglio usare Twisted basato su gevent o gevent?
Wojciech Danilo,

8
@remdezx Quanto alla tua domanda, ci sono due ragioni. Uno è che la gente trova Twisted difficile da capire perché la programmazione concorrente è difficile da capire. Passano quindi a GEvent perché è superficialmente facile da capire - fintanto che non c'è concorrenza, tutto funziona esattamente come ti aspetteresti. L'altro motivo è che è molto meno lavoro trasferire il codice su GEvent che non è stato scritto utilizzando un'API basata sugli eventi per ottenere i vantaggi in termini di prestazioni dell'I / O basato sugli eventi. Se il tuo codice non condivide troppo stato, tale porta probabilmente funziona bene.
Glifo

1
@Glyph, stai parlando di concorrenza, ma ... né Gevent né Twisted supportano la concorrenza (ovviamente puoi usare il multiprocessing con gevent e usare un pool di thread reali e un pool di greenlet su ogni thread - che funziona bene per me e puoi usare il plug-in Twisted per fare esattamente lo stesso - esegui più intuizioni contorte l'una accanto all'altra). Ma Twisted ti procura qualcosa di più che geniale? Penso che anche con più istanze di gevent / twisted, gevent sia più facile da comprendere e senza i suoi callback espliciti. Mi sto perdendo qualcosa?
Wojciech Danilo,

2
@ danilo2 Sì, ti manca almeno una cosa :). In particolare si fraintende la parola "concorrenza" per indicare "esecuzione parallela simultanea su più CPU". Twisted può eseguire una programmazione I / O simultanea tramite I / O asincrono (basato su callback). GEvent può eseguire la programmazione I / O simultanea tramite un programmatore di micro-thread. In Twisted, utilizzando spawnProcess, questa pianificazione I / O può essere tradotta anche in programmazione CPU.
Glifo

48

Mi piace la risposta @Glyph. Twisted è un framework Python molto completo e ricco. Twisted e Tornado hanno un design molto simile. E mi piace molto questo design:

  • è veloce
  • facile da capire
  • facile da estendere
  • non richiede estensioni c
  • funziona su PyPy.

Ma voglio evidenziare Tornado , che preferisco e che recentemente ho guadagnato popolarità. Tornado, come Twisted, utilizza la programmazione in stile callback, ma può essere integrato usando tornado.gen.engine(twisted.internet.inlineCallbacks in Twisted).

codebase

Il miglior commento è dal sito http://cyclone.io . il ciclone prova a mescolare Twisted e Tornado perché:

Twisted è una delle librerie più mature per l'I / O non bloccante disponibile al pubblico. Tornado è la versione open source del web server di FriendFeed, uno dei server Web più popolari e veloci per Python, con un'API molto decente per la creazione di applicazioni web.

L'idea è quella di collegare l'API elegante e semplice di Tornado all'Event-Loop di Twisted, consentendo un vasto numero di protocolli supportati.

Ma nel 2011 tornado.platform.twisted è uscito il che porta funzionalità simili.

Prestazione

Il tornado ha prestazioni molto migliori . Funziona anche perfettamente con PyPy e ottiene un enorme guadagno.

scalabilità

Lo stesso di Twisted. Tornado ha tornado.processimplementato molti servizi rpc.

Funzionalità

Ci sono 71 pacchetti basati su Tornado, rispetto ai 148 di Twisted e 48 di Gevent. Ma se osservi attentamente e calcoli la mediana dei tempi di caricamento dei pacchetti, vedrai che i Twisted sono i più vecchi, quindi Gevent e Tornado i più freschi. Inoltre c'è un tornado.platform.twistedmodulo che ti permette di eseguire il codice scritto per Twisted su Tornado .

Sommario

Con Tornado puoi usare un codice di Twisted. Non è necessario utilizzare il ciclone che torce solo il codice (il codice diventa più disordinato).

Per quanto riguarda il 2014, Tornado è considerato un framework asincrono ampiamente accettato e predefinito che funziona sia su python2 che su python3. Anche l'ultima versione 4.x offre molte funzionalità da https://docs.python.org/dev/library/asyncio.html .

Ho scritto un articolo, spiegando perché considero quel Tornado, il miglior framework Web Python in cui ho scritto molto di più sulla funzionalità Tornado.


15

( AGGIORNAMENTO : Sono tristemente sorpreso dal fatto che poche risposte qui raccomandino o addirittura menzionino Gevent: non penso che sia proporzionale alla popolarità, alle prestazioni e alla facilità d'uso di questa eccellente biblioteca!)

Gevent e Twisted non si escludono a vicenda, anche se all'inizio potrebbe sembrare ovvio. Esiste un progetto chiamato geventreactorche consente di sfruttare in modo relativamente fluido il meglio di entrambi i mondi, vale a dire:

  • Il modello di thread efficiente ed economico (cooperativo verde) di Gevent, che è molto più facile da programmare quando si tratta di concorrenza - francamente, Twisted's inlineCallbacksnon è all'altezza in termini di prestazioni quando si tratta di molte coroutine, e nemmeno in condizioni di facilità / trasparenza d'uso: yielde Deferredsovunque; spesso difficile costruire alcune astrazioni; stack orribilmente inutili traccia sia con le Deferreds nude che con, e ancora di più con@inlineCallbacks .
  • Tutte le funzionalità integrate di Twisted che puoi mai sognare, incluso ma non limitato a IReactorProcess.spawnProcess.

Attualmente sto usando personalmente Gevent 1.0rc2 con Twisted 12.3 colmato da geventreactor. Ho implementato le mie aggiunte e miglioramenti non ancora pubblicati e geventreactorche presto pubblicherò, si spera come parte del geventreactorrepository GitHub originale: https://github.com/jyio/geventreactor .

Il mio layout attuale mi permette di programma nel bel modello di programmazione di Gevent, e le cose leva, come non-blocking socket, urllib2e altri moduli. Posso usare il normale codice Python per fare cose regolari, al contrario della curva di apprendimento e l'inconveniente di fare anche cose semplici e basilari nel modo contorto. Posso anche usare facilmente la maggior parte delle librerie di terze parti che sono normalmente fuori discussione con Twisted o richiedono l'uso di thread.

Posso anche evitare completamente la programmazione imbarazzante e spesso eccessivamente complessa basata su callback usando greenlet (invece di se Deferrede callback e / o @inlineCallbacks).

(Questa risposta è stata scritta sulla base delle mie esperienze personali avendo usato sia Twisted che Gevent in progetti di vita reale, con molta più esperienza con Twisted (ma non pretendo di essere un esperto di Twisted). Il software che ho dovuto scrivere non ha non è stato necessario utilizzare troppe funzionalità di Twisted, quindi a seconda del set di funzionalità necessarie per Twisted, la complessità extra (relativamente indolore) del mixare Gevent e Twisted potrebbe non valere la pena.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.