2010-01-23 10 views
6

Tengo una aplicación cerebrito que estoy controlando sobre http con un wxpython ui. Quiero matar al servidor cuando la interfaz de usuario cierre, pero no sé cómo hacerlo. En este momento sólo estoy haciendo un sys.exit() en el evento de cierre de la ventana, pero eso es lo que resulta endeteniendo un servidor cerebrito sobre http

Traceback (most recent call last): 
    File "ui.py", line 67, in exitevent 
    urllib.urlopen("http://"+server+"/?sigkill=1") 
    File "c:\python26\lib\urllib.py", line 87, in urlopen 
    return opener.open(url) 
    File "c:\python26\lib\urllib.py", line 206, in open 
    return getattr(self, name)(url) 
    File "c:\python26\lib\urllib.py", line 354, in open_http 
    'got a bad status line', None) 
IOError: ('http protocol error', 0, 'got a bad status line', None) 

es que debido a que no voy a parar cherrypy correctamente?

Respuesta

7

¿Cómo se detiene CherryPy? ¿Enviándose un SIGKILL a sí mismo? Debería enviar TERM como mínimo, pero sería aún mejor llamar al cherrypy.engine.exit() (versión 3.1+). Ambas técnicas permitirán que CherryPy se cierre con mayor gracia, lo que incluye permitir que todas las solicitudes en proceso (como su solicitud "? Sigkill = 1") finalicen y cierren sin problemas.

3

Uso os._exit. También lo puse en un hilo, para que pueda servir una página de "usted ha salido del servidor" antes de salir.

class MyApp(object): 
    @cherrypy.expose 
    def exit(self): 
     """ 
     /exit 
     Quits the application 
     """ 

     threading.Timer(1, lambda: os._exit(0)).start() 
     return render("exit.html", {})