2010-01-23 6 views
6

J'ai une application cherrypy que je contrôle sur http avec un ux wxpython. Je veux tuer le serveur quand l'interface utilisateur se ferme, mais je ne sais pas comment faire cela. En ce moment, je fais juste un sys.exit() sur la fenêtre événement close mais c'est pour résultatarrêter un serveur cherrypy sur 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) 

est que parce que je ne suis pas arrêter cherrypy correctement?

Répondre

7

Comment arrêtez-vous CherryPy? En envoyant un SIGKILL à lui-même? Vous devriez au moins envoyer TERM, mais mieux encore, appeler le cherrypy.engine.exit() (version 3.1+). Les deux techniques permettront à CherryPy de s'arrêter plus gracieusement, ce qui inclut le fait de permettre à toutes les demandes en cours de traitement (comme votre demande "? Sigkill = 1" de se terminer et de se fermer proprement).

3

J'utilise os._exit. Je l'ai également mis sur un fil, de sorte que je puisse servir une page "vous avez quitté le serveur" avant de quitter.

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

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