2012-06-09 13 views
7

Capisco che il tornado sia un server a thread singolo e non bloccante, quindi le richieste vengono gestite in modo sequenziale (tranne quando si utilizza l'approccio basato sugli eventi per il funzionamento IO).La concorrenza è possibile nel tornado?

Esiste un modo per elaborare più richieste parallele nel tornado per l'esecuzione normale (non-IO). Non è possibile eseguire il fork di più processi poiché ho bisogno di uno spazio di memoria comune tra le richieste.

Se non è possibile, suggerire a me altri server python in grado di gestire la richiesta parallela e supportare anche wsgi.

risposta

7

Se siete veramente andando a che fare con più richieste simultanee che sono compute-bound, e volete farlo in Python, allora avete bisogno di un server multi-processo, non multi-threaded. CPython ha Global Interpreter Lock (GIL) che impedisce a più thread di eseguire bytecode python nello stesso momento.

La maggior parte delle applicazioni Web esegue calcoli molto piccoli, e invece sono in attesa di I/O, dal database o dal disco o dai servizi su altri server. Assicurati di aver bisogno di gestire le richieste legate all'elaborazione prima di scartare Tornado.

5

La risposta alla tua domanda dipende in realtà da quanto tempo verranno eseguiti questi thread a calcolo. Se sono a corto raggio e la velocità di elaborazione corrisponde almeno alla velocità con cui arrivano, allora Tornado andrà bene. È veramente single-threaded, ma scala molto bene.

Se le richieste legate all'elaborazione sono lunghe, l'utilizzo di un server con thread non sarà necessariamente d'aiuto poiché, come già rilevato da Ned Batchelder, il GIL rappresenterà un collo di bottiglia.

Se si riesce a ridurre la limitazione di avere lo stesso spazio di memoria su tutte le richieste, si potrebbe prendere in considerazione l'esecuzione di Tornado con PyZMQ, in quanto fornisce un modo di eseguire più back-end Tornado, fronteggiato da una singola istanza di Tornado . Ciò consente di continuare a utilizzare Tornado per l'intera soluzione. Vedi il modulo web.zmqweb di PyZMQ per ulteriori informazioni.

+0

Grazie per le vostre risposte. Non sono a conoscenza di GIL. Quindi, in nessun modo posso fare il processo parallelo usando i thread in CPython e devo andare con il multi-processo. – Adhi

+1

Puoi eseguire l'elaborazione parallela in Python, ma non utilizzerai tutte le tue risorse dato che utilizzerai solo il processo Python con 1 CPU pr quando esegui il codice Python. Quindi puoi usare i thread per la concorrenza, ma c'è un certo limite ai guadagni di prestazioni disponibili. Ma molte volte Tornado aspetterà l'I/O, quindi c'è molto da guadagnare aggiungendo il threading ad esempio. –

+0

zmqweb è stato estratto da PyZMQ nel proprio progetto: https://github.com/ellisonbg/zmqweb –