2013-08-30 18 views
10

Avevo implementato un server Web multi-thread utilizzando il micro framework Flask. Fondamentalmente, il mio server ha una coda di attività e un pool di thread. Quindi, può gestire più richieste. Poiché Flask è implementato in Python e i thread Python non sono realmente concomitanti, la mia app web è un po 'laggosa.Alternative di flaconi per ottenere il vero multi-threading?

Esistono alternative a Flask per risolvere il problema del multi-threading?

+1

In che modo stai schierando Flask? Non sarebbe così tanto su Flask stessa. –

+1

Ricorda che il multi-threading in Python potrebbe benissimo essere adatto a ciò che stai tentando di fare. Le parti "lente" della tua vista potrebbero essere cose come il servizio web o le chiamate al database o un server web configurato in modo non corretto che sta creando un processo Python per ogni richiesta. Qualunque sia il problema attuale, non sappiamo cosa sia per aiutarti a risolverlo con i dettagli che hai fornito. Inoltre, la richiesta di un'alternativa a Flask richiede fondamentalmente un suggerimento per uno strumento, che non è una domanda che StackOverflow è progettato per gestire a causa delle molteplici risposte possibili. –

+0

Come hai detto, sto creando un processo per richiesta. Ma non posso evitarlo perché, il servizio web sta esponendo un sistema di sintesi vocale (TTS) che viene implementato come un binario separato. Per interagire con il processo TTS sto usando il modulo pexpect. Quindi, per richiesta, un thread libero esistente dal pool di thread genera il processo TTS utilizzando pexpect. So che il design è un po 'strano. Ecco il link all'attuale implementazione http://sitspeech.iitkgp.ac.in/. Apprezzo qualsiasi suggerimento per migliorare il design attuale. – user2586432

risposta

7

Questo non è colpa di Flask, è una limitazione nell'interprete Python, quindi qualsiasi framework che si utilizza sarà soggetto ad esso.

Ma c'è un ottimo modo per evitare questo problema. Per avere una vera concorrenza è possibile utilizzare un pool di processi anziché thread. Il modulo fornisce un'API compatibile con quella del modulo di threading, ma crea processi figlio per i lavoratori. Ho usato questo modulo per creare operatori in background per le applicazioni Flask e ho trovato che funziona molto bene.

22

Mi sono imbattuto in questa domanda e sono rimasto un po 'deluso che nessuno abbia indicato come flask (e la maggior parte delle applicazioni web Python sono significava essere distribuito). Vedere: http://flask.pocoo.org/docs/deploying/#deployment

mia opzione di distribuzione preferito è il super-semplice Tornado che funziona altrettanto bene su Linux e di Windows (se mi distribuirlo insieme a siti web esistenti, o anche una distribuzione ibrida come parte di un sito esistente, I di solito usano IIS Application Request Routing [ARR] come Reverse Proxy a Tornado). Ho anche usato gevent su entrambi con grande successo.

Tornado è una versione open source del server Web scalabile e non bloccante e degli strumenti che potenziano FriendFeed. Poiché non è bloccante e utilizza epoll, può gestire migliaia di connessioni simultanee in piedi, il che significa che è l'ideale per i servizi Web in tempo reale. L'integrazione di questo servizio con la boccetta è semplice:

Quindi, se la vostra applicazione pallone è in yourapplication.py, si potrebbe creare un altro chiamato tornado_web.py e utilizzarlo per servire la vostra applicazione in questo modo:

from tornado.wsgi import WSGIContainer 
from tornado.httpserver import HTTPServer 
from tornado.ioloop import IOLoop 
from yourapplication import app 

http_server = HTTPServer(WSGIContainer(app)) 
http_server.listen(5000) 
IOLoop.instance().start() 

via: http://flask.pocoo.org/docs/deploying/wsgi-standalone/#tornado

+0

Ho appena installato tornado sulla mia app (staright in avanti come detto), ma mi mancano i log utili del server predefinito di flask con le chiamate che si trovano sulla console in tempo reale - sai come si può fare in tornado? @Aaoron –

Problemi correlati