Prima di tutto, le richieste possono essere gestito in modo indipendente. Tuttavia, i server vogliono simultaneamente gestirli al fine di mantenere il numero di richieste che possono essere gestite per volta al massimo.
L'implementazione di questo concetto di concorrenza dipende dal server web.
Alcune implementazioni possono avere un numero fisso di thread o processi per la gestione delle richieste. Se tutti sono in uso, le richieste aggiuntive devono attendere fino a quando non vengono gestite.
Un'altra possibilità è che un processo o un thread venga generato per ogni richiesta. Generare un processo per ogni richiesta porta ad una memoria assurda e sovraccarico della CPU. Generare fili leggeri è meglio. In questo modo, puoi servire centinaia di clienti al secondo. Tuttavia, anche i thread portano il loro overhead di gestione, manifestandosi in alta memoria e consumo di CPU.
Per servire migliaia di client al secondo, un'architettura basata sugli eventi basata su coroutine asincrone è una soluzione all'avanguardia. Consente al server di servire i client ad alta velocità senza generare milioni di miliardi di thread. Sul numero Wikipedia page of the so-called C10k problem si trova un elenco di server Web. Tra questi, molti fanno uso di questa architettura.
Le coroutine sono disponibili anche per Python. Dai un'occhiata allo http://www.gevent.org/. Ecco perché un'applicazione Python WSGI basata su ad esempio uWSGI + gevent è una soluzione estremamente performante.
fonte
2012-09-26 14:43:25
Che condivisione dello stato? L'intero punto delle richieste web è che ognuna è indipendente, non esiste uno stato condiviso. –