остановка сервера вишневого через http

У меня есть приложение cherrypy, которое я контролирую через http с помощью пользовательского интерфейса wxpython. Я хочу убить сервер, когда пользовательский интерфейс закрывается, но я не знаю, как это сделать. Прямо сейчас я просто делаю sys.exit() для события закрытия окна, но это приводит к

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)

это потому, что я не останавливаю вишневый должным образом?


person d.c    schedule 23.01.2010    source источник


Ответы (2)


Как вы останавливаете CherryPy? Отправив себе SIGKILL? Вместо этого вы должны как минимум отправить TERM, но еще лучше было бы вызвать cherrypy.engine.exit() (версия 3.1+). Оба метода позволят CherryPy завершать работу более изящно, что включает в себя разрешение любых внутрипроцессных запросов (например, самого запроса «?sigkill=1») завершаться и корректно закрываться.

person fumanchu    schedule 25.01.2010

Я использую os._exit. Я также поместил его в поток, чтобы я мог обслуживать страницу «вы покинули сервер» перед выходом.

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

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