2012-06-07 21 views
70

Sto costruendo un'app con Flask, ma non so molto su WSGI e sulla sua base HTTP, Werkzeug. Quando inizio a servire un'applicazione Flask con gunicorn e 4 processi di lavoro, significa che posso gestire 4 richieste simultanee?Quante richieste simultanee riceve un singolo processo Flask?

Voglio dire richieste simultanee e non richieste al secondo o qualsiasi altra cosa.

Grazie!

risposta

104

Quando si esegue il server di sviluppo si esegue app.run(), si ottiene un singolo processo sincrono, che significa che al massimo 1 richieste vengono elaborate alla volta.

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

E 'importante notare che Gunicorn comprende anche i lavoratori asincroni, vale a dire eventlet e gevent (e anche tornado, ma che è meglio utilizzato con il quadro Tornado, a quanto pare).Specificando uno di questi operatori asincroni con il flag --worker-class, si ottiene Gunicorn che gestisce un numero di processi asincroni, ognuno dei quali è il che gestisce la propria concorrenza. Questi processi non utilizzano thread, ma piuttosto coroutine. Fondamentalmente, all'interno di ogni processo, può accadere solo 1 cosa alla volta (1 thread), ma gli oggetti possono essere "messi in pausa" quando sono in attesa che i processi esterni finiscano (si pensi alle query del database o in attesa sull'I/O della rete).

Ciò significa che, se si utilizza uno dei lavoratori asincroni di Gunicorn, ciascun operatore 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 gira, ecc. Ulteriori dettagli sono disponibili nella pagina Gunicorn's design e nella pagina di introduzione notes on how gevent works.

+2

Gunicorn ora supporta i thread "reali" dalla versione 19. Vedi [this] (http: //docs.gunicorn. org/it/stable/design.html # how-many-threads) e [this] (http://docs.gunicorn.org/en/stable/settings.html#threads). –

7

No, puoi sicuramente gestire di più.

È importante ricordare che in profondità, supponendo che si stia utilizzando un singolo computer, la CPU esegue solo un'istruzione * alla volta.

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

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

Queste "cose" possono essere processi, ovvero 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 di processi che consentono anche la concorrenza.

Il motivo per cui i 4 processi di lavoro saranno in grado di gestire più di 4 richieste è che verranno attivati ​​dai thread per gestire un numero sempre maggiore di richieste.

Il limite di richiesta effettiva dipende dal server HTTP scelto, io O, sistema operativo, hardware, connessione di rete/ecc

Buona fortuna!

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

+1

È gunicorn che genera i fili o Flask? Non ho trovato prove a supporto di nessuna possibilità. –

+2

gunicorn genera i processi – Carson

+0

Certo, lo capisco dei processi, ma la risposta dice che più thread vengono generati secondo necessità. Questo è quello di cui vorrei avere conferma. –

18

Flask elaborerà una richiesta per thread allo stesso tempo. Se hai 2 processi con 4 thread ciascuno, si tratta di 8 richieste simultanee.

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

Problemi correlati