2010-10-28 9 views
6

Ho un'applicazione Python che è demonizzata e in esecuzione su un server 24/7. Mi piacerebbe essere in grado di fornire un'interfaccia web incredibilmente semplice in modo da poter monitorare i valori variabili di alcune variabili all'interno del programma.Dando alla mia applicazione Python un'interfaccia web per monitorarlo, usando Tornado

Sto usando Tornado e sono attivo e funzionante con il semplice 'Hello, world' che puoi trovare su Tornado homepage. Tuttavia, non appena viene chiamato tornado.ioloop.IOLoop.instance().start(), entra nel ciclo e non ritorna. Il mio programma esistente è (essenzialmente) un ciclo infinito, ma voglio integrare i due.

Quindi, la mia domanda è: come posso costruire il mio programma in modo da poter monitorare le variabili all'interno del mio ciclo infinito utilizzando Tornado per fornire un'interfaccia web?

risposta

4

È possibile utilizzare il pacchetto threading ed eseguire Tornado all'interno del proprio thread?

Edit:

La documentazione del modulo threading a http://docs.python.org/library/threading.html ha più dettagli, ma sto immaginando qualcosa di simile:

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

fatemi sapere se funziona!

+0

Questo suona come il tipo di percorso che preferirei andare giù - come posso eseguire Tornado all'interno del proprio thread usando 'threading'? –

+0

Ho provato ad aggiungere del codice; dai un'occhiata e vedi se ti fa iniziare! –

+0

E se imposti 't.daemon = True' sul thread prima di avviarlo, il thread - e Tornado con esso - si spegnerà quando il thread principale che sta eseguendo il demone si chiude. –

2

Credo che l'approccio migliore (leggi: più semplice) sarebbe quello di fare in modo che l'app daemon scriva quelle particolari variabili che si desidera monitorare su una spaziatura condivisa a cui l'app tornado può accedere. Questo potrebbe essere un file, un socket, un database o un archivio di valori-chiave. Alcune idee idee che vengono in mente è usare il tuo database esistente (se ce n'è uno,) sqlite, o anche memcached. Quindi, avresti semplicemente la tua applicazione di tornado per leggere quei valori da ovunque li hai archiviati.

Si è corretto nel fatto che una volta eseguito il flusso di controllo di tornado.ioloop.IOLoop.instance().start() tornado non ritorna mai da quel ciclo. Da quel momento in poi, il controllo della tua applicazione rimarrà all'interno dell'Applicazione e dei RequestHandler che hai definito.

+0

Non sei molto esplicito a riguardo, ma ho ragione che il tuo suggerimento è che dovrebbe eseguire due processi invece di uno, con un processo che esegue il suo codice daemon e l'altro che esegue il ciclo degli eventi del tornado? Se è così, non sono sicuro che sia una soluzione davvero eccezionale; coordinare due processi in modo che possano sempre iniziare e fermarsi insieme può essere un po 'complicato. –

0

Un'altra soluzione meno elegante sarebbe quella di utilizzare yaml per serializzare periodicamente gli oggetti dall'app principale e fare in modo che l'app Web li legga. È possibile anche eseguire il dump degli oggetti in yaml, in modo da poter vedere i diversi stati di questi.

0

Si potrebbe provare a utilizzare http://www.zeromq.org/ come mezzo di comunicazione tra i due processi/thread.

Problemi correlati