2010-03-04 35 views
15

Estoy tratando de encontrar la manera de ejecutar un proceso en un hilo de fondo en Django. Soy nuevo en Django y en los hilos, así que tengan paciencia si uso la terminología equivocada.Django: iniciar un proceso en un hilo de fondo?

Aquí está el código que tengo. Básicamente me gustaría que start_processing comience tan pronto como se active la función success. Sin embargo, start_processing es el tipo de función que podría tardar unos minutos o fallar (depende de un servicio externo sobre el que no tengo control), y no quiero que el usuario tenga que esperar a que se complete correctamente antes de que el se muestra la vista. ('Éxito' en lo que a ellos respecta, no depende del resultado de start_processing;. Soy la única persona que tiene que preocuparse si falla)

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

Desde el googlear que he hecho, la mayoría de la gente sugiere que los hilos de fondo no se usan en Django, y en su lugar un trabajo cron es más adecuado. Pero me gustaría que start_processing comience tan pronto como el usuario llegue a la función de éxito, en lugar de esperar hasta que se ejecute la tarea cron. ¿Hay alguna forma de hacer esto?

+1

Duplicado: http://stackoverflow.com/questions/844570/web-application-background-processes-newbie-design-question, entre muchos otros. –

+1

La mayoría de estos son útiles también: http://stackoverflow.com/search?q=%5Bdjango%5D+process –

+0

Dupliacte: http://stackoverflow.com/questions/1619397/how-to-start-a- long-running-process-from-django-view, http://stackoverflow.com/questions/219329/django-fastcgi-how-to-manage-a-long-running-process –

Respuesta

5

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

3

IIUC, el problema aquí es que el proceso de servidor web podría no como hilos de larga duración extra, que podría matar/procesos del servidor de desove ya que la demanda suben y bajan, etc, etc

Usted es probablemente mejor de comunicándose a un proceso de servicio externo para este tipo de procesamiento, en lugar de incrustarlo en el proceso wsgi/fastcgi del servidor web.

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

17

Si realmente necesita un truco rápido, simplemente inicie un proceso usando subprocess.

Pero me no recomendar lanzando un proceso (o incluso un hilo), especialmente si su sitio web es pública: en el caso de alta carga (que podría ser "natural" o el resultado de una trivial DoS ataque) , estarías generando muchos procesos o hilos, que terminarían usando todos los recursos de tu sistema y matando a tu servidor.

En cambio, yo recomendaría usar un servidor de trabajos: yo uso Celery (con Redis como back-end), es muy simple y funciona genial. 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 liviano. Aquí está an example de cómo hacer esto.

Saludos

7

En caso de que alguien realmente quiere ejecutar 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 en primer lugar, a continuación, imprimir "proceso terminado" a la consola. Entonces el usuario no enfrentará ningún retraso.

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

También es posible que necesite utilizar hilos en un proyecto grande. Porque ejecutar Apio en todos sus 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 Apio con procesos de larga duración.

Úselo con prudencia.

Cuestiones relacionadas