Recientemente he comenzado a experimentar con el uso de Python para el desarrollo web. Hasta ahora he tenido éxito usando Apache con mod_wsgi y el framework web de Django para Python 2.7. Sin embargo, me he encontrado con algunos problemas con la ejecución constante de procesos, la actualización de la información y demás.¿Cómo puedo ejecutar procesos de Python a largo plazo (infinitos)?
He escrito un script que llamo "daemonManager.py" que puede iniciar y detener todos o cada uno de los bucles de actualización de Python (¿Debería llamarlos Daemons?). Lo hace bifurcando, luego carga el módulo para las funciones específicas que debe ejecutar y comienza un bucle infinito. Guarda un archivo PID en /var/run
para realizar un seguimiento del proceso. Hasta aquí todo bien. Los problemas que he encontrado son:
De vez en cuando uno de los procesos se acaba de dejar de fumar. Reviso
ps
por la mañana y el proceso simplemente se va. No se registraron errores (estoy usando el módulologging
), y estoy cubriendo todas las excepciones que pueda pensar y registrándolas. Además, no creo que estos procesos de abandono tengan algo que ver con mi código, porque todos mis procesos ejecutan un código completamente diferente y salen en intervalos bastante similares. Podría estar equivocado, por supuesto. ¿Es normal que los procesos de Python simplemente mueran después de que se han ejecutado durante días/semanas? ¿Cómo debería abordar este problema? ¿Debo escribir otro daemon que compruebe periódicamente si los otros daemons aún se están ejecutando? ¿Qué pasa si ese daemon se detiene? No sé cómo manejar esto.¿Cómo puedo saber mediante programación si un proceso todavía se está ejecutando o no? Estoy guardando los archivos PID en
/var/run
y comprobando si el archivo PID está allí para determinar si el proceso se está ejecutando o no. Pero si el proceso simplemente muere por causas inesperadas, el archivo PID se mantendrá. Por lo tanto, tengo que eliminar estos archivos cada vez que un proceso falla (un par de veces por semana), lo que de alguna manera frustra el propósito. Supongo que podría verificar si un proceso se está ejecutando en el PID en el archivo, pero ¿qué ocurre si otro proceso ha comenzado y se le asignó el PID del proceso inactivo? Mi daemon pensaría que el proceso está funcionando bien, incluso si hace tiempo que murió. Una vez más, estoy perdido cómo lidiar con esto.
Cualquier respuesta útil sobre cómo mejores procesos infinita Python de ejecución, con suerte también arrojar alguna luz sobre los problemas anteriores, aceptaré
estoy usando Apache 2.2.14 de una máquina Ubuntu.
Mi versión de Python es 2.7.2
Si agrega algunos ejemplos de código que muestran el código de los daemons que se bloquean, es posible que podamos abordar aspectos específicos. Lo primero es lo primero, eliminaría todo el código de tus scripts que tratan sobre bifurcación, supervisión, redirección, etc. –
Puedes aclarar si estás bifurcando estos procesos de daemon desde la aplicación WSGI que se ejecuta bajo mod_wsgi o por separado. No debería realizar dicha creación de proceso desde una aplicación que se ejecuta en mod_wsgi. –
Parece que hay mucha publicidad aquí. Quiero decir, esta es una pregunta bien colocada, en la que se da una respuesta a una tecnología específica, a la que se da otra respuesta en la que se responde de nuevo "También terminé usando" otra tecnología más (¿competitiva?) ... – citn