Quante richieste simultanee riceve un singolo processo Flask?


138

Sto creando un'app con Flask, ma non so molto su WSGI e sulla sua base HTTP, Werkzeug. Quando inizio a pubblicare un'applicazione Flask con gunicorn e 4 processi di lavoro, ciò significa che posso gestire 4 richieste simultanee?

Intendo richieste simultanee e non richieste al secondo o altro.

Risposte:


183

Quando si esegue il server di sviluppo, che è quello che si ottiene eseguendo app.run(), si ottiene un singolo processo sincrono, il che significa che al massimo 1 richiesta viene elaborata alla volta.

Attaccando Gunicorn nella sua configurazione predefinita e semplicemente aumentando il numero di --workers, ciò che ottieni è essenzialmente un numero di processi (gestiti da Gunicorn) che si comportano come il app.run()server di sviluppo. 4 lavoratori == 4 richieste simultanee. Questo perché Gunicorn utilizza il synctipo di lavoratore incluso per impostazione predefinita.

È importante notare che Gunicorn include anche lavoratori asincroni, vale a dire eventlete gevent(e anche tornado, ma è meglio utilizzato con il framework Tornado, a quanto pare). Specificando uno di questi lavoratori asincroni con la --worker-classbandiera, ciò che ottieni è che Gunicorn gestisce una serie di processi asincroni, ognuno dei quali gestisce la propria concorrenza. Questi processi non usano thread, ma invece coroutine. Fondamentalmente, all'interno di ogni processo, può ancora succedere solo 1 cosa alla volta (1 thread), ma gli oggetti possono essere "messi in pausa" quando stanno aspettando il completamento di processi esterni (pensa alle query del database o in attesa sull'I / O di rete).

Ciò significa che se stai utilizzando uno dei lavoratori asincroni di Gunicorn, ogni lavoratore può gestire più di una singola richiesta alla volta. Il numero massimo di dipendenti dipende dalla natura della tua app, dal suo ambiente, dall'hardware su cui è in esecuzione, ecc. Maggiori dettagli sono disponibili nella pagina di progettazione di Gunicorn e note su come gevent funziona nella sua pagina di introduzione.


4
Gunicorn ora supporta thread "reali" dalla versione 19. Vedi questo e questo .
Filipe Correia,

2
Come si tiene traccia di quali risorse vengono condivise (e come) e quali sono completamente separate tra thread / processi? Ad esempio, come gestirò una situazione in cui desidero condividere un'enorme struttura di dati tra diversi processi gestiti da Gunicorn e utilizzati nei gestori di Flask?
Johann Petrak,

Quello che stai chiedendo a @Johsm è come chiedere come condividere i dati tra diversi processi all'interno del sistema operativo. La risposta a ciò può rispondere alla tua domanda, devi usare l'archiviazione esterna poiché i processi non condividono la sua memoria con altri processi. Gunicorn è qui solo per utilizzare architetture CPU multiprocessore ma non gestisce tali problemi.
Adkl,

E Eva? Questo vale anche per Eva?
Eswar,

2
il server di sviluppo del pallone usa i thread di default dalla v1.0 ( github.com/pallets/flask/pull/2529 )
hychou,

40

Attualmente esiste una soluzione molto più semplice di quelle già fornite. Quando esegui la tua applicazione devi solo passare il threaded=Trueparametro alla app.run()chiamata, come:

app.run(host="your.host", port=4321, threaded=True)

Un'altra opzione per quanto possiamo vedere nei documenti di werkzeug è usare il processesparametro, che riceve un numero> 1 che indica il numero massimo di processi simultanei da gestire:

  • threaded: il processo dovrebbe gestire ogni richiesta in un thread separato?
  • processi: se maggiore di 1, gestire ciascuna richiesta in un nuovo processo fino a questo numero massimo di processi simultanei.

Qualcosa di simile a:

app.run(host="your.host", port=4321, processes=3) #up to 3 processes

Maggiori informazioni sul run()metodo qui e sul post sul blog che mi ha portato a trovare la soluzione e i riferimenti api.


Nota: sui documenti di Flask sui run()metodi è indicato che l'utilizzo in un ambiente di produzione è sconsigliato perché ( citazione ): "Sebbene leggero e facile da usare, il server integrato di Flask non è adatto alla produzione in quanto non si adatta bene ".

Tuttavia, fanno riferimento alla pagina Opzioni di distribuzione per i modi consigliati per farlo quando si avvia la produzione.


5
Grazie per le informazioni. È importante notare che il documento per l'esecuzione indica che non deve essere utilizzato in un ambiente di produzione affermando che non soddisfa i requisiti di sicurezza o prestazioni.
Coffee_fan

1
@Coffee_fan hai ragione. Anche sull'ultimo 1.1.x lo scoraggiano e suggeriscono invece di controllare la loro pagina sulle Opzioni di distribuzione quando si va alla produzione. Inclusa la tua preziosa osservazione nella risposta :)
DarkCygnus il

33

Flask elaborerà una richiesta per thread contemporaneamente. Se hai 2 processi con 4 thread ciascuno, sono 8 richieste simultanee.

Flask non genera né gestisce thread o processi. Questa è la responsabilità del gateway WSGI (ad es. Gunicorn).


9

No, puoi sicuramente gestirne di più.

È importante ricordare che in profondità, supponendo che si stia eseguendo una macchina single core, la CPU esegue davvero solo un'istruzione * alla volta.

Vale a dire, la CPU può eseguire solo un set molto limitato di istruzioni e non può eseguire più di un'istruzione per tick di clock (molte istruzioni richiedono anche più di 1 tick).

Pertanto, la maggior parte della concorrenza di cui parliamo in informatica è la concorrenza software. In altre parole, ci sono livelli di implementazione del software che astraggono da noi la CPU di livello inferiore e ci fanno pensare che stiamo eseguendo il codice contemporaneamente.

Queste "cose" possono essere processi, che sono unità di codice che vengono eseguite contemporaneamente, nel senso che ogni processo pensa di funzionare nel proprio mondo con la propria memoria non condivisa.

Un altro esempio sono i thread, che sono unità di codice all'interno dei processi che consentono anche la concorrenza.

Il motivo per cui i tuoi 4 processi di lavoro saranno in grado di gestire più di 4 richieste è che si attiveranno thread per gestire sempre più richieste.

Il limite della richiesta effettiva dipende dal server HTTP scelto, I / O, SO, hardware, connessione di rete ecc.

In bocca al lupo!

* le istruzioni sono i comandi di base che la CPU può eseguire. esempi: aggiungi due numeri, passa da un'istruzione all'altra


1
È il gunicorno che genera i fili o il pallone? Non ho trovato prove a sostegno di entrambe le possibilità.
jd.

1
Certo, lo capisco riguardo ai processi, ma la risposta dice che vengono generati più thread secondo necessità. Questo è ciò di cui vorrei avere conferma.
jd.

4
"nel profondo, supponendo che tu stia eseguendo una macchina single core, la CPU esegue davvero solo un'istruzione * alla volta" Questo non è corretto sulle macchine moderne. La maggior parte delle CPU moderne sono pipelined e superscalar , dove anche un singolo core ha più unità di esecuzione e un decodificatore di istruzioni che converte il "codice macchina" visto dal lato software nelle micro-op hardware effettive che vengono inviate alle singole unità di esecuzione.
Michael Geary,

1
Per chiarire, nel passato, le CPU eseguivano direttamente le istruzioni numeriche in un eseguibile: il codice macchina. Ogni riferimento CPU aveva un diagramma di temporizzazione delle istruzioni che mostrava quanti cicli di clock prendevano ciascuna istruzione, inclusi eventuali riferimenti di memoria. Quindi potresti semplicemente sommare i tempi per sapere quanto tempo impiegherebbe un pezzo di codice. Le CPU moderne non sono affatto così. Un'eccezione interessante è il BeagleBone che ha un moderno processore ARM superscalare e due vecchi processori "PRU" con tempi di istruzione fissi.
Michael Geary,

1
E per chiarire che , quando ho detto "moderno", lo stavo usando come una scorciatoia libera per processori come chip ARM / Intel / AMD - pipeline, superscalar, ecc. Naturalmente ci sono anche processori moderni che funzionano alla vecchia maniera con tempismo fisso per istruzione, come le PRU BeagleBone che ho citato e vari nuovi microcontrollori. (E ora torniamo a Gunicorn!)
Michael Geary,
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.