2011-06-28 14 views
5

Yo uso djutils@async decorador para llamar a una función de forma asíncrona. Esto funciona bien cuando inicio mi servidor con el comando estándar ./manage.py runserver. Pero cuando ejecuto mi aplicación django en gunicornio y llamo a la función con el decorador @async no ocurre nada ...Django-utils @async decorator y gunicorn no funcionan

Miré en el código del decorador async de djutils y agrega y objeta un estándar de python Cola, y también engendrando uno o más hilos para consumir la cola.

¿alguien una idea o sugerencia donde debería mirar después, para obtener mis funciones @async funcionando en gunicorn? ¿Gunicornn está cambiando la implementación estándar de la implementación del subproceso python?

Respuesta

1

Los subprocesos de Python están sujetos a la interferencia del bloqueo de intérprete global y es muy probable que Gunicorn esté aplicando un parche en el comportamiento de subprocesamiento predeterminado. Entonces podrías intentar cambiar su Tipo de trabajador. Si tu Gunicorn está configurado para usar trabajadores asíncronos con Gevent, entonces puede parchear el subproceso porque Gevent puede hacerlo, reemplazando la clase de subproceso con un subproceso "verde" que sea cooperativo.

Personalmente odio las respuestas "hazlo de otra manera", así que perdón por dar una. No genere hilos o procesos fork desde el proceso de su servidor web. Simplemente descarga ese trabajo a una cola de fondo.

Crear su propia cola de fondo es fácil si tiene necesidades simples. Tenga una tabla en su base de datos que registre trabajos pendientes y completados, en combinación con un script cron que se ejecuta cada 5 minutos más o menos y trabaje desde allí.

Y si quiere algo estable y que pueda escalar, Celery es bastante bueno.

0

El código (en djutils/decorators.py) para iniciar los hilos que procesan los elementos en la cola se invoca cuando primero se inicia el gunicornio, es decir, se invoca para el proceso maestro de la armadura. Sin embargo, gunicorn tenedor varios procesos de trabajo. Al hacerlo, el código para iniciar los hilos NO se vuelve a invocar. Como tal, estos hilos de fondo solo están presentes en el proceso maestro de los arácnidos y no en ninguno de los procesos de los trabajadores de gunicornio.