Pregunta

Esta pregunta ya tiene respuesta aquí:

Estoy creando un pequeño panel para un usuario que le permitirá ejecutar trabajos específicos.Estoy usando Django, así que quiero que pueda hacer clic en un enlace para iniciar el trabajo y luego devolverle la página con un mensaje de que el trabajo se está ejecutando.Los resultados del trabajo le serán enviados por correo electrónico más tarde.

Creo que se supone que debo usar subprocess.Popen pero no estoy seguro de eso.Entonces, en pseudocódigo, esto es lo que quiero hacer:

if job == 1:
    run script in background: /path/to/script.py
    return 'Job is running'
¿Fue útil?

Solución

p = subprocess.Popen([sys.executable, '/path/to/script.py'], 
                                    stdout=subprocess.PIPE, 
                                    stderr=subprocess.STDOUT)

Eso iniciar el subproceso en segundo plano. Su guión sigue funcionando con normalidad.

Lea la documentación rel="noreferrer"> .

Otros consejos

La ejecución de este a través de una cola de mensajes es definitivamente el camino a seguir si usted está pensando acerca de la expansión a largo plazo. Enviar un mensaje a la cola que está corriendo constantemente en el fondo, y escribir controladores de trabajo para hacer frente a los diferentes tipos de mensajes.

Dado que está utilizando Django, creo beanstalkd es un muy buen ajuste. Aquí es un muy buen tutorial sobre el tema. El primer comentario en ese artículo también tiene algunos buenos consejos.

En lo personal He rodado con una costumbre en memoria servidor de cola escrito en Erlang, con Python-fijaciones escritas en C. Pero Redis parece que podría funcionar como un gran competidor para el futuro de puesta en cola / mensajería en las necesidades. Esperamos que esto ayude!

subprocess.Popen es precisamente lo que busca.

Aunque si descubre que desea comenzar a comunicar una gran cantidad de información entre el subproceso y el padre, es posible que desee considerar un subproceso o un marco RPC como Twisted.

Pero lo más probable es que sean demasiado pesados ​​para su aplicación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top