2009-09-13 7 views
11

Una de las funciones de mi vista es un trabajo de procesamiento muy largo y claramente necesita ser manejado de manera diferente. En lugar de hacer que el usuario espere mucho tiempo, sería mejor si pudiera almorzar el trabajo de procesamiento que enviaría los resultados por correo electrónico, y sin esperar la finalización, notifique al usuario que su solicitud se procesa y permita que naveguen. Sé que puedo usar os.fork, pero me preguntaba si existe una "forma correcta" en términos de Django. Tal vez pueda devolver la respuesta HTTP, y que seguir con este trabajo de alguna manera?¿Cómo lanzar una solicitud de trabajo asíncrona en la vista de Django?

+0

duplicado: http: // stackoverflow .com/questions/1352678/is-there-any-way-to-make-an-asynchronous-function-call-from-python-django/ –

+0

¡Qué mal, pensé que había buscado muy a fondo! –

+0

No parece que haya una respuesta simple, desafortunadamente. –

Respuesta

1

¿Por qué no simplemente iniciar un thread para hacer el procesamiento y luego continuar enviando la respuesta?

10

Existen un par de soluciones para este problema, y ​​la mejor depende un poco de la carga de trabajo.

Si tiene una carga de trabajo ligera, puede usar el enfoque utilizado por django-mailer que define un modelo de "trabajos", guardar nuevos trabajos en la base de datos y cron ejecutar un script independiente cada cierto tiempo para procesar el trabajos almacenados en la base de datos (eliminándolos cuando termine). Puede usar algo como django-chronograph para administrar la programación del trabajo más fácilmente

Si necesita ayuda para entender cómo escribir un script para procesar el trabajo, consulte el artículo de James Bennett Standalone Django Scripts para obtener ayuda.

Si tiene una carga de trabajo muy alta, lo que significa que necesitará más de un servidor para procesar los trabajos, entonces desea utilizar una cola de tareas de distribución real. Hay mucha competencia aquí, así que no puedo detallar todas las opciones, pero una buena para usar con las aplicaciones de Django es celery.

1

Antes de seleccionar una solución, debe determinar cómo se ejecutará el proceso. Es decir, ¿es el mismo proceso para cada usuario individual, los datos son los mismos y se pueden programar regularmente? o cada usuario solicita algo y los resultados son ligeramente diferentes?

Como ejemplo, si los datos serán los mismos para cada usuario individual y se pueden ejecutar según un programa, podría usar cron.

Ver: http://www.b-list.org/weblog/2007/sep/22/standalone-django-scripts/ o http://docs.djangoproject.com/en/dev/howto/custom-management-commands/

Sin embargo, si las solicitudes serán ad hoc y que necesita algo escalable que puede manejar alta carga y es asíncrona: lo que en realidad se está buscando es un sistema de hacer fila mensaje. Su vista agregará una solicitud a la cola que luego se activará.

Hay algunas opciones para implementar esto en Django Django: servicio de cola es puramente Django & pitón y simple, aunque la última confirmación fue en abril y parece que el proyecto ha sido abandonado. http://code.google.com/p/django-queue-service/

La segunda opción si necesita algo que escala, se distribuye y hace uso de mensajes de código abierto haciendo fila servidores: el apio es lo que necesita

http://ask.github.com/celery/introduction.html http://github.com/ask/celery/tree

+0

Sí, los resultados son totalmente diferentes por solicitud. –

+0

Demiurgo, en ese caso necesita ver con qué frecuencia se solicitará esta vista. Si será mucho, sugiero una solución de cola. De esta forma, se puede solicitar la vista, agregarla a la cola sin que el usuario tenga que esperar a que se complete. – ismail

Cuestiones relacionadas