django multithreading

Django: iniciar un proceso en un hilo de fondo?



multithreading (4)

Estoy intentando averiguar cómo ejecutar un proceso en un subproceso en segundo plano en Django. Soy nuevo tanto para Django como para los hilos, así que, por favor, tengan paciencia conmigo si uso la terminología de manera incorrecta.

Aquí está el código que tengo. Básicamente, me gustaría que el start_processing de inicio comience tan pronto como se start_processing la función de success . Sin embargo, start_processing es el tipo de función que fácilmente puede tardar unos minutos o fallar (depende de un servicio externo sobre el cual no tengo control), y no quiero que el usuario tenga que esperar a que se complete con éxito antes de la vista está renderizada. (El ''éxito'' en lo que a ellos respecta no depende del resultado del start_processing de start_processing ; soy la única persona que necesita preocuparse si falla).

def success(request, filepath): start_processing(filepath) return render_to_response(''success.html'', context_instance = RequestContext(request))

De la búsqueda en Google que he hecho, la mayoría de la gente sugiere que los subprocesos en segundo plano no se usan en Django, y en cambio, un trabajo cron es más adecuado. Pero me gustaría start_processing con el start_processing de inicio tan pronto como el usuario llegue a la función de éxito, en lugar de esperar hasta que se ejecute el trabajo cron. ¿Hay alguna forma de hacer esto?


En caso de que alguien realmente quiera correr otro hilo.

def background_process(): import time print("process started") time.sleep(100) print("process finished") def index(request): import threading t = threading.Thread(target=background_process, args=(), kwargs={}) t.setDaemon(True) t.start() return HttpResponse("main thread content")

Esto devolverá la respuesta primero, luego imprima "proceso terminado" a la consola. Así que el usuario no se enfrentará a ningún retraso.

Usar apio es definitivamente una mejor solución. Sin embargo, la instalación de Celery podría ser innecesaria para un proyecto muy pequeño con un servidor limitado, etc.

También es posible que necesites usar hilos en un proyecto grande. Porque ejecutar Celery en todos tus servidores no es una buena idea. Entonces no habrá una manera de ejecutar un proceso separado en cada servidor. Es posible que necesite hilos para manejar este caso. Las operaciones del sistema de archivos pueden ser un ejemplo. Sin embargo, no es muy probable y aún es mejor usar Celery con procesos de larga ejecución.

Use sabiamente


IIUC, el problema aquí es que al proceso del servidor web no le gustan los subprocesos de larga ejecución adicionales, puede matar / generar procesos del servidor a medida que la demanda sube y baja, etc.

Probablemente sea mejor que se comunique con un proceso de servicio externo para este tipo de procesamiento, en lugar de integrarlo en el proceso wsgi / fastcgi del servidor web.

Si lo único que está enviando es la ruta de archivo, debería ser bastante fácil escribir esa aplicación de servicio.


No estoy seguro de que necesites un hilo para eso. Parece que solo quieres generar un proceso, así que busca en el módulo de subprocess .


Si realmente necesita un truco rápido, simplemente comience un proceso utilizando subprocess .

Pero no recomendaría generar un proceso (o incluso un subproceso), especialmente si su sitio web es público: en caso de una carga alta (que podría ser "natural" o el resultado de un ataque DoS trivial), estaría generando muchos Procesos o subprocesos, que terminarían agotando todos los recursos de su sistema y matando a su servidor.

En su lugar, recomendaría usar un servidor de trabajo: uso Celery (con Redis como backend), es muy simple y funciona muy bien. Puede consultar muchos otros servidores de trabajo, como RabbitMQ o Gearman. En su caso, un servidor de trabajo podría ser excesivo: simplemente podría ejecutar Redis y usarlo como un servidor de mensajes ligero. Aquí hay un ejemplo de cómo hacer esto.

Aclamaciones