2010-01-23 6 views
6

Ich habe eine cherrypy App, die ich über HTTP mit einem Wxpython ui kontrollieren. Ich möchte den Server töten, wenn die UI schließt, aber ich weiß nicht, wie das geht. Im Moment bin ich nur ein sys.exit() auf das Fenster schließen Ereignis zu tun, aber das ist wasStoppen eines cherrypy Servers über 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) 

ist, dass, weil ich bin nicht zu stoppen cherrypy richtig?

Antwort

7

Wie stoppen Sie CherryPy? Indem Sie eine SIGKILL an sich selbst senden? Sie sollten TERM stattdessen mindestens senden, aber noch besser wäre es, cherrypy.engine.exit() (Version 3.1 +) zu nennen. Beide Techniken ermöglichen es CherryPy, eleganter herunterzufahren, was es ermöglicht, alle In-Process-Anfragen (wie Ihre "? Sigkill = 1" -Anfrage selbst) sauber zu beenden und zu schließen.

3

Ich benutze os._exit. Ich lege es auch auf einen Thread, so dass ich eine "Sie haben den Server verlassen" Seite vor dem Beenden servieren kann.

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

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