2010-01-05 14 views
9

Bueno, quiero que cherrypy mate todos los hilos secundarios en la recarga automática en lugar de "Esperar a que los hilos hijo terminen" porque mi programa tiene hilos propios y no sé cómo superar esto. . CherryPy sigue colgado en que una línea y no sé qué hacer para obtener los 'niños' para finalizar las discusiones ...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... 

`

nunca continúa .. Así que quiero forzar a los hilos secundarios a que se cierren ...

Sé que es porque mi aplicación utiliza hilos propios y creo que cherrypy quiere que esos hilos se cierren junto con CherryPy ... ¿Puedo superar esto? ?

+0

estoy empezando a pensar que debería sobrecargar auto-recarga de CherryPy matar a mi propia client.thread ... Pero, ¿cómo, yo no conoci. – user233864

Respuesta

11

tiene que escribir código que detiene sus hilos, y registrarlo como un detector para el 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() 

Ver http://www.cherrypy.org/wiki/BuiltinPlugins y http://www.cherrypy.org/wiki/CustomPlugins para más detalles.

+1

Bien. Voy a mirar en esto. Estoy usando el método de inicio rápido. ¿Puedo poner estos métodos de inicio y detención dentro de mi clase raíz que uso con cherrypy.quickstart()? O puede decirme cómo usaría esta clase MyFeature(), con mi clase root ya estoy usando Root() .. Lo siento, no he tenido un uso extenso con CherryPy .. – user233864

+2

Sure; puedes poner ese código donde quieras; lo único importante es que lo suscribas antes de ejecutar el inicio rápido. – fumanchu

-1

Esto funciona con inicio rápido

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