2010-10-28 11 views
6

Tengo una aplicación Python que se demoniza y ejecuta en un servidor 24/7. Me gustaría poder ofrecer una interfaz web increíblemente simple para que pueda controlar los valores cambiantes de algunas variables dentro del programa.Dando a mi aplicación Python una interfaz web para monitorearlo, usando Tornado

Estoy usando Tornado, y estoy funcionando con el simple 'Hola, mundo' que puedes encontrar en el Tornado homepage. Sin embargo, tan pronto como se llama al tornado.ioloop.IOLoop.instance().start(), entra en el bucle y no regresa. Mi programa existente es (esencialmente) un ciclo infinito también, pero quiero integrar los dos.

Entonces, mi pregunta es: ¿cómo puedo construir mi programa para que pueda monitorear variables dentro de mi bucle infinito usando Tornado para proporcionar una interfaz web?

Respuesta

4

¿Es posible utilizar el paquete threading y ejecutar Tornado dentro de su propio hilo?

Editar:

La documentación threading módulo en http://docs.python.org/library/threading.html tiene más detalles, pero estoy imaginando algo como esto:

import threading 
t = threading.Thread(target = tornado.ioloop.IOLoop.instance().start) 
t.start() 

Avísame si funciona!

+0

Esto suena como el tipo de ruta que preferiría bajar: ¿cómo puedo ejecutar Tornado dentro de su propio subproceso usando 'threading'? –

+0

He intentado agregar un código; échale un vistazo y mira si te ayuda a empezar! –

+0

Y si establece 't.daemon = True' en el hilo antes de iniciarlo, entonces el hilo - y Tornado con él - se apagará cuando salga el hilo principal que está ejecutando su daemon. –

2

Creo que el mejor enfoque (leer: más fácil) sería que tu aplicación daemon escriba esas variables particulares que deseas monitorear en un espacio compartido al que tu aplicación de tornado pueda acceder. Esto podría ser un archivo, un socket, una base de datos o un almacén de clave-valor. Algunas ideas que te vienen a la mente son utilizar tu base de datos existente (si hay una,) sqlite, o incluso memcached. Entonces, simplemente haría que su aplicación de tornado lea esos valores desde donde los almacenó.

Tiene razón en que una vez que ejecuta tornado.ioloop.IOLoop.instance().start() el flujo de control del tornado nunca regresa de ese bucle. A partir de ese punto, el control de su aplicación se mantendrá dentro de los Application y RequestHandlers que haya definido.

+0

No es muy explícito al respecto, pero ¿tengo razón en que su sugerencia es que debería ejecutar dos procesos en lugar de uno, con un proceso ejecutando su código daemon y el otro ejecutando el ciclo de eventos de tornado? Si es así, no estoy seguro de que sea una gran solución; coordinar dos procesos para que siempre comiencen y detengan juntos puede ser un poco tedioso. –

0

Otra solución menos elegante sería utilizar yaml para serializar los objetos periódicamente desde su aplicación principal, y hacer que la aplicación web los lea. Incluso puede volcar objetos en yaml, para que pueda ver los diferentes estados de esos.

Cuestiones relacionadas