2012-10-10 5 views
11

Capisco che sia tornado sia gevent siano framework python asincroni.Differenze tra gevent e tornado

Durante la lettura dello bottle documentation ho scoperto che gevent in realtà NON è asincrono e puoi creare migliaia di pseudo-thread che funzionano in modo sincrono.

In modo marginale, in gevent, non è possibile interrompere anticipatamente il gestore della richiesta ed è necessario restituire la risposta completa, mentre nel tornado è possibile. (correggimi se ho torto qui)

Qualcuno può descrivere in dettaglio come funzionano questi sistemi internamente e in che modo sono diversi. Inoltre, in che modo WSGI gioca con la natura asincrona di questi sistemi? Questi framework sono conformi ai WSGI, se sì, come?

+0

penso che motore http://emptysquare.net/motor/ sia una soluzione che ha fatto un ponte tra di loro: p –

risposta

24

Avere una lettura di:

http://en.wikipedia.org/wiki/Coroutines

e:

http://en.wikipedia.org/wiki/Event-driven_architecture

http://en.wikipedia.org/wiki/Event-driven_programming

Il pacchetto gevent utilizza coroutine e Tornado è event driven.

Anche i sistemi guidati non possono essere mappati facilmente in WSGI, ma un sistema di coroutine, poiché assomiglia ai thread, può essere utilizzato per supportare WSGI se i punti di blocco possono essere corretti per passare le coroutine quando le cose si bloccano.

+1

Grazie! Spiegazione molto avvincente! – emanuelcds

19

gevent e Tornado sono un po 'diversi. gevent è molto più simile a Twisted - un framework di rete asincrono, mentre Tornado è un framework solo web.

Il clou principale di gevent è che utilizza le coroutine e rende il codice come se fosse in esecuzione in modo sincrono, ma in realtà la maggior parte delle funzioni di blocco IO sono non bloccanti e restituiscono il controllo al ciclo principale di gevent. Questo è molto importante per la programmazione legata all'IO in quanto consente di scrivere codice a thread singolo altamente efficiente nello stesso modo in cui si scriverebbe codice multithread, che è molto più affamato di risorse.

gevent include anche un gestore di richieste WSGI in modo che possa essere utilizzato per gestire le richieste HTTP in modo standalone, come ad esempio Tornado.

Tornado è un framework Web asincrono che si basa sul programmatore per scrivere codice asincrono in Python, il che è spesso un problema nello Backend perché non ci sono chiusure o classi anonimi multilinea, come in JavaScript o Java. Pertanto, scrivere un buon codice usando Tornado è davvero difficile. Ad esempio, l'utilizzo di librerie di blocchi diventa un dolore.

In effetti entrambi i framework sono asincroni al loro interno, ma il codice risultante sembra leggermente diverso (più facile da programmare con gevent).

In realtà è possibile utilizzare Torando e gevent insieme, ma non l'ho ancora provato (ancora).

+0

+1 ma hai dimenticato di dire che il tornado ha un contenitore wsgi e che diventa un server web. – BlaShadow

+1

Non so se è più difficile scrivere codice asincrono con Tornado.Se non altro, la parola chiave 'yield' - che JavaScript manca per ora - rende il codice molto pulito e facile da seguire. Non c'è passaggio di callback. Inoltre, la gestione centralizzata delle eccezioni con Tornado è molto più pulita rispetto a, ad esempio, NodeJS, dove devi sapere cosa stai facendo, oppure ottieni una perdita di memoria. –

+2

"dolore nel backend" - lo adoro! – FullStack