2009-10-24 7 views
14

se necesita para ejecutar un proceso que podría tardar horas en completarse desde una vista de Django. No necesito saber el estado o comunicarme con él, pero necesito esa vista para redirigir lejos justo después de comenzar el proceso.¿Cómo iniciar un proceso de larga duración desde una vista de Django?

He intentado usar subprocess.Popen, usándolo dentro de un nuevo threading.Thread, multiprocessing.Process. Sin embargo, el proceso principal sigue pendiente hasta que el hijo finaliza. La única forma en que casi lo logra es usando un tenedor. Obviamente, eso no es bueno ya que deja un proceso zombie atrás hasta que el padre termina.

Eso es lo que estoy tratando de hacer cuando se utiliza tenedor:

if os.fork() == 0: 
    subprocess.Popen(["/usr/bin/python", script_path, "-v"]) 
else: 
    return HttpResponseRedirect(reverse('view_to_redirect')) 

Entonces, ¿hay una forma de ejecutar un proceso totalmente independiente de una vista de Django con bajas mínimas? ¿O estoy haciendo algo mal?

+2

duplicado de todos ellos: http://stackoverflow.com/search?q=%5Bpython%5D+long-running. http://stackoverflow.com/questions/1107826/python-long-running-daemon-job-processor, http://stackoverflow.com/questions/805120/python-task-server –

Respuesta

10

No sé si esto va a ser adecuado para su caso, sin embargo, esto es lo que hago: Yo uso una cola de tareas (a través de un modelo de Django); cuando se llama a la vista, ingresa un nuevo registro en las tareas y redirige felizmente. Las tareas a su vez son ejecutadas por cron de manera regular independientemente de django.

Editar: cron llama al (o hechos) de comando relevante Django para ejecutar la tarea.

5

En primer lugar - tratar de usar cron para usted tarea, como dicen temprana Shanyu.

Si no le conviene - a continuación, tratar de utilizar CeleryProject, para la cola de tareas de Django. Para trabajar usa RabbitMQ. Y aquí hay un pequeño overview para el uso simple de los futuros de base

Cuestiones relacionadas