2013-02-11 10 views

risposta

182

flask.Flask.run accetta argomenti aggiuntivi di parole chiave (**options) che inoltra a werkzeug.serving.run_simple - due di questi argomenti sono threaded (che è possibile impostare per True per consentire threading) e processes (che è possibile impostare a un numero maggiore di uno di avere werkzeug genera più di un processo per gestire le richieste). Quindi, se si fa:

if __name__ == '__main__': 
    app.run(threaded=True) 
    # Alternately 
    # app.run(processes=3) 

Flask dirà Werkzeug utilizzare threading e per deporre le uova tre processi per gestire le richieste in arrivo.

Detto questo, di Werkzeug serving.run_simple avvolge il pacchetto della libreria standard wsgiref - e quel pacchetto contiene un'implementazione di riferimento di WSGI, non un web server pronto per la produzione. Se si intende utilizzare Flask in produzione (presupponendo che "produzione" non sia un'applicazione interna a traffico limitato con non più di 10 utenti simultanei) assicurarsi di posizionarlo dietro un server Web reale (consultare la sezione dei documenti di Flask intitolata Deployment Options per alcuni metodi suggeriti).

+1

Cosa succede se sto guardando un massimo di 100 utenti? Posso semplicemente assegnare 'processes = 100' ed essere felice con esso? Nel mio caso, ho solo bisogno di file statici, non di metodi HTTP Post. Il mio requisito è, voglio eseguire tutti i thread di Flask come parte della mia app genitore, in modo che tutti possano condividere le variabili. – ATOzTOA

+1

* Chuckles * - @ATOzTOA - no, probabilmente sarebbe * abbastanza * controproducente (i processi sono relativamente costosi e, a meno che tu non stia facendo molto lavoro in ogni richiesta, non c'è motivo per cui 4 o 8 processi non dovrebbero essere abbastanza). Detto questo, se si sta visualizzando solo contenuto statico, sarebbe meglio con un server ottimizzato per farlo (Apache, ngnix, IIS). –

+1

Inoltre, non è generalmente necessario condividere le variabili tra le richieste: se * si * è necessario limitarsi a un processo o utilizzare alcune comunicazioni fuori banda (Redis, un database, il filesystem, ecc. .) in modo che ogni processo rimanga sincronizzato. –

32

L'utilizzo del semplice app.run() dall'interno di Flask crea un singolo server sincrono su un singolo thread in grado di servire solo un client alla volta. È inteso per l'uso in ambienti controllati con bassa domanda (cioè sviluppo, debug) proprio per questo motivo.

Generare thread e gestirli autonomamente non ti porterà molto lontano, a causa di the Python GIL.

Detto questo, avete ancora delle buone opzioni. Gunicorn è un server WSGI solido e facile da usare che ti consente di generare più lavoratori (processi separati, quindi nessuna preoccupazione GIL) e arriva anche con asynchronous workers che velocizzerà la tua app (e renderla più sicura) con poco nessun lavoro da parte tua (specialmente con Flask).

Tuttavia, anche Gunicorn probabilmente non dovrebbe essere esposto pubblicamente. In produzione, dovrebbe essere utilizzato dietro un server HTTP più robusto; nginx tende ad andare bene con Gunicorn e Flask.

+0

Gunicorn e nginx sono completamente pitone, giusto? Quindi, posso generare ognuno di questi come un thread separato dalla mia app Python? – ATOzTOA

+8

non proprio. Gunicorn è pitone, nginx no. non è come li useresti, però. Gunicorn ti consente di eseguire la tua app come 'app gunicorn: app 127.0.0.1: 8080' invece di' python app.py'. Nginx agirà come servizio pubblico che espone la tua app privata Gunicorn [(un reverse proxy)] (http://en.wikipedia.org/wiki/Reverse_proxy), nascondendo tutti i tipi di dettagli di implementazione HTTP di livello inferiore, forse servire file statici direttamente, ecc. –

Problemi correlati