En primer lugar, las solicitudes pueden ser manejado de forma independiente. Sin embargo, los servidores desean simultáneamente manejarlos para mantener el número de solicitudes que se pueden manejar por tiempo como máximo.
La implementación de este concepto de concurrencia depende del servidor web.
Algunas implementaciones pueden tener un número fijo de subprocesos o procesos para gestionar solicitudes. Si todos están en uso, las solicitudes adicionales tienen que esperar hasta que se manejen.
Otra posibilidad es que se genere un proceso o subproceso para cada solicitud. Engendrar un proceso para cada solicitud lleva a una memoria absurda y una sobrecarga de la CPU. Engendrar hilos ligeros es mejor. Al hacerlo, puede atender a cientos de clientes por segundo. Sin embargo, los subprocesos también generan una sobrecarga de administración, que se manifiesta en una gran cantidad de memoria y consumo de CPU.
Para servir a miles de clientes por segundo, una arquitectura basada en eventos basada en corutinas asíncronas es una solución de vanguardia. Permite que el servidor sirva a los clientes a un ritmo elevado sin generar tropezones de hilos. En el Wikipedia page of the so-called C10k problem encontrará una lista de servidores web. Entre ellos, muchos hacen uso de esta arquitectura.
Coroutines están disponibles para Python, también. Mira en http://www.gevent.org/. Es por eso que una aplicación Python WSGI basada en, por ejemplo, uWSGI + gevent, es una solución extremadamente eficaz.
¿Qué estado comparte? El objetivo de las solicitudes web es que cada una es independiente, no hay un estado compartido. –