Posso servire più client usando solo Flask app.run () come standalone?


202

So di poter collegare Flask con Apache o altri server web. Ma stavo pensando di eseguire Flask come server autonomo che serve più client contemporaneamente.

È possibile? Devo gestire la generazione di più thread e gestirli?

Risposte:


295

flask.Flask.runaccetta argomenti di parole chiave aggiuntive ( **options) che inoltra a werkzeug.serving.run_simple- due di questi argomenti sono threaded(un valore booleano) e processes(che è possibile impostare su un numero maggiore di uno per far sì che werkzeug generi più di un processo per gestire le richieste).

threadedil valore predefinito è TrueFlask 1.0, quindi per le ultime versioni di Flask, il server di sviluppo predefinito sarà in grado di servire più client contemporaneamente per impostazione predefinita. Per le versioni precedenti di Flask, è possibile passare esplicitamente threaded=Trueper abilitare questo comportamento.

Ad esempio, puoi farlo

if __name__ == '__main__':
    app.run(threaded=True)

gestire più client usando i thread in modo compatibile con le versioni precedenti di Flask, oppure

if __name__ == '__main__':
    app.run(threaded=False, processes=3)

per dire a Werkzeug di generare tre processi per gestire le richieste in arrivo, o semplicemente

if __name__ == '__main__':
    app.run()

per gestire più client usando i thread se sai che utilizzerai Flask 1.0 o versioni successive.

Detto questo, Werkzeug racchiude serving.run_simpleil wsgirefpacchetto della libreria standard e quel pacchetto contiene un'implementazione di riferimento di WSGI, non un server Web pronto per la produzione. Se stai per usare Flask in produzione (supponendo che "produzione" non sia un'applicazione interna a basso traffico con non più di 10 utenti simultanei) assicurati di sostenerlo dietro un vero server web (vedi la sezione dei documenti di Flask intitolata Opzioni di distribuzione per alcuni metodi suggeriti).


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

4
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 sufficienti). Detto questo, se stai solo visualizzando contenuto statico, staresti meglio con un server ottimizzato per farlo (Apache, ngnix, IIS).
Sean Vieira,

2
Inoltre, non dovresti comunemente dover condividere le variabili tra le richieste: in tal caso dovrai limitarti a un processo o utilizzare una comunicazione fuori banda (Redis, un database, il filesystem, ecc.), Quindi che ciascuno dei tuoi processi rimanga sincronizzato.
Sean Vieira,

3
@ATOzTOA - se non riesci a creare un server migliore, allora mi darei un vortice e vedo cosa succede. Se non funziona bene sotto carico, è possibile distribuirlo dietro un altro server web.
Sean Vieira,

2
@ATOzTOA, riguardo alla tua domanda sul perché non puoi specificare "threaded" e "process" allo stesso tempo, vedi il codice qui: werkzeug.readthedocs.org/en/latest/_modules/werkzeug/serving
pyrho

62

L'uso 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. È destinato all'uso in ambienti controllati a bassa richiesta (ad es. Sviluppo, debug) proprio per questo motivo.

Generare thread e gestirli da soli probabilmente non ti porterà molto lontano, a causa di Python GIL .

Detto questo, hai ancora alcune buone opzioni. Gunicorn è un server WSGI solido e facile da usare che ti consentirà di generare più lavoratori (processi separati, quindi non preoccuparti di GIL) e persino di lavoratori asincroni che accelereranno la tua app (e la renderanno più sicura) con poco a nessun lavoro da parte tua (specialmente con Flask).

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


17
non proprio. Gunicorn è pitone, nginx no. non è così che li useresti, però. Gunicorn ti consente di eseguire la tua app come gunicorn app:app 127.0.0.1:8080anziché python app.py. Nginx fungerebbe da servizio pubblico che espone la tua app privata Gunicorn (un proxy inverso) , nascondendo tutti i tipi di dettagli di implementazione HTTP di livello inferiore, magari servendo direttamente i file statici, ecc.
Ryan Artecona,

Flask con app.run (threaded = True) funziona molto bene su Apache2 usando mod_wsgi flask.palletsprojects.com/en/1.1.x/deploying/mod_wsgi
MortenB
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.