2011-11-01 14 views
12

Antes de publicar esto, he leído bastantes recursos en línea, incluida la wiki mod_wsgi, pero estoy confundido acerca de cómo exactamente los procesos Apache/hilos interactúan con mod_wsgi.Interacción Apache + mod_wsgi

Este es mi entendimiento actual: Apache se puede configurar para que uno o más procesos secundarios puedan manejar solicitudes entrantes, y cada uno de estos procesos secundarios se puede configurar para usar uno o más subprocesos para las solicitudes de servicio. Después de eso, las cosas se vuelven confusas para mí. Mis dudas son:

  1. ¿Qué es un WSGIDaemonProcess, y quién realmente llama a mi aplicación Django utilizando el subinterpretador de python?
  2. Si mi aplicación Django se ejecuta en un modo en el que se permiten varios subprocesos en un solo proceso secundario de Apache, ¿significa eso que varias solicitudes podrían acceder simultáneamente a mi aplicación al mismo tiempo? De ser así, ¿podría hacer algo como establecer una variable de nivel de módulo (por ejemplo, la identificación de un usuario) sobreescrito por otras solicitudes paralelas y conducir a un comportamiento no seguro de subprocesos?
  3. Para el caso anterior, con el bloqueo de intérprete global de Python, ¿se ejecutarían realmente los subprocesos en paralelo?

Respuesta

10

Respuestas a cada uno de los puntos.

1 - WSGIDaemonProcess/WSGIProcessGroup indica que mod_wsgi debería incluir un proceso separado para ejecutar la aplicación WSGI. Esto es solo un fork y no un fork/exec, por lo que mod_wsgi todavía tiene el control de él. Cuando se detecta que una URL se correlaciona con una aplicación WSGI que se ejecuta en modo daemon, el código mod_wsgi en los procesos de trabajo infantil de Apache enviará los detalles de la solicitud al proceso del modo daemon donde el código mod_wsgi lo lee y llama a su WSGI solicitud.

2 - Sí, varias solicitudes pueden estar operando simultáneamente y querer modificar los datos globales del módulo al mismo tiempo.

3 - Para el tiempo que la ejecución está dentro de Python, entonces no, no se ejecutan estrictamente en paralelo ya que el bloqueo de intérprete global significa que solo un hilo puede ejecutar código Python a la vez. El intérprete de Python cambiará periódicamente qué subproceso se ejecutará. Si uno de los subprocesos llama al código C y libera el GIL, al menos durante el tiempo que ese subproceso está en ese estado, puede ejecutarse en paralelo a otros subprocesos, ejecutándose en Python o código C. Como ejemplo, cuando las llamadas se realizan en la capa Apache/mod_wsgi para escribir datos de respuesta, se libera el GIL. Esto significa que la escritura real de los datos de respuesta en las capas inferiores no impide que otros subprocesos se ejecuten.

Cuestiones relacionadas