2010-01-05 1 views
9

Bene, voglio cherrypy per uccidere tutti i thread figlio su auto-ricarica invece di "In attesa di terminare i thread figlio" perché il mio programma ha thread propri e non so come superare questo . CherryPy continua appeso su quello di linea e non so cosa fare per ottenere il 'thread figlio' per terminare ...Force CherryPy Child Threads

`

[05/Jan/2010:01:14:24] ENGINE HTTP Server cherrypy._cpwsgi_server.CPWSGIServer(('127.0.0.1', 8080)) shut down 
[05/Jan/2010:01:14:24] ENGINE Stopped thread '_TimeoutMonitor'. 
[05/Jan/2010:01:14:24] ENGINE Bus STOPPED 
[05/Jan/2010:01:14:24] ENGINE Bus EXITING 
[05/Jan/2010:01:14:24] ENGINE Bus EXITED 
[05/Jan/2010:01:14:05] ENGINE Waiting for child threads to terminate... 

`

è mai continua .. Quindi voglio forzare i thread figlio a chiudersi ...

So che è perché la mia applicazione utilizza i thread e suppongo che Cherrypy voglia chiudere quei thread insieme a CherryPy .... Posso superare questo ?

+0

sto iniziando a pensare che dovrei sovraccaricare l'auto-ricarica di CherryPy di ​​uccidere la mia client.thread ... Ma come, io non kno. – user233864

risposta

11

È necessario scrivere codice che interrompe le discussioni che hai, e registrarlo come un listener per l'evento 'stop':

from cherrypy.process import plugins 

class MyFeature(plugins.SimplePlugin): 
    """A feature that does something.""" 

    def start(self): 
     self.bus.log("Starting my feature") 
     self.threads = mylib.start_new_threads() 

    def stop(self): 
     self.bus.log("Stopping my feature.") 
     for t in self.threads: 
      mylib.stop_thread(t) 
      t.join() 

my_feature = MyFeature(cherrypy.engine) 
my_feature.subscribe() 

Vedi http://www.cherrypy.org/wiki/BuiltinPlugins e http://www.cherrypy.org/wiki/CustomPlugins per maggiori dettagli.

+1

Ok. Lo esaminerò. Sto usando il metodo Quickstart. Posso inserire questi metodi di avvio e arresto all'interno della mia classe radice che uso con cherrypy.quickstart()? Oppure puoi dirmi come userò questa classe MyFeature(), con la mia root class che sto usando Root(). Spiacente, non ho avuto un uso esteso con CherryPy .. – user233864

+2

Sicuro; puoi mettere quel codice ovunque tu voglia; l'unica cosa importante è che tu lo sottoscrivi prima di iniziare quickstart. – fumanchu

-1

Questo funziona con QuickStart

def stopit(): 
    print 'stop handler invoked' 
    #... 
stopit.priority = 10 
cherrypy.engine.subscribe('stop', stopit)