Почему Торнадо так долго умирает, когда я нажимаю Ctrl-C? - PullRequest
3 голосов
/ 06 марта 2012

При разработке приложения Tornado я часто хочу перезапустить сервер, чтобы получить новые изменения. Я нажал Ctrl-C, чтобы остановить сервер, но с Tornado это выглядит очень медленно. Он ждет много секунд перед выключением или вообще не выключается при выдаче ctrl-c.

Что странно, если после нажатия ctrl-c я делаю новый запрос к серверу (например, обновляя мой браузер, указывающий на сервер), он сразу выключается.

Кто-нибудь знает, как это объяснить или исправить? Кто-нибудь испытывал нечто подобное?

(Обратите внимание, это в Windows.)

Ответы [ 3 ]

3 голосов
/ 06 марта 2012

В Python сигналы всегда обрабатываются основным потоком.Если IOLoop запускается из основного потока, он заблокирует его, когда сервер простаивает и ожидает ввода-вывода.В результате все сигналы будут ожидающими в потоке, чтобы проснуться.Это объясняет, почему при отправке запроса сервер отключается.

ОБНОВЛЕНИЕ: вы можете попробовать что-то вроде этого:

def set_ping(ioloop, timeout):
    ioloop.add_timeout(timeout, lambda: set_ping(ioloop, timeout))

, а затем:

ioloop = tornado.ioloop.IOLoop.instance()
set_ping(ioloop, timedelta(seconds=2))
ioloop.start()

при запускепетля.В результате будет вызван select с тайм-аутом 2,0 секунды, что предотвратит блокировку.(См. Также IOLoop Timeouts )

(Примечание: я не смог воспроизвести вашу ситуацию в Linux, хотя я вручную установил select, поэтому я не могу дать 100% гарантию, чтоэто поможет, но звучит правдоподобно)

2 голосов
/ 06 марта 2012

Я не знаю, почему для выхода с Ctrl+C требуется так много времени, но в некоторых случаях у меня получалось нажать Ctrl+\ (терминал Linux)

0 голосов
/ 22 октября 2012

add_timeout работает;если вы хотите сэкономить на перерегистрации тайм-аута, вместо этого вы можете сделать это:

ili=tornado.ioloop.IOLoop.instance()
tornado.ioloop.PeriodicCallback(lambda: None,500,ili).start()
ili.start()
...