У меня есть веб-страница, которую я бы хотел перезагрузить, когда я вношу изменения, однако у меня могут быть потоки, которые я не хочу прерывать автозагрузкой. То, что у меня сейчас работает, в том, что потоки могут закончить, но после внесения изменений, но до перезагрузки веб-страница не отвечает, если я нажимаю на что-либо.Как реализовать неблокируемое ожидание в автозагрузке tornado reload_hook?
@tornado.gen.coroutine
def wait_on_threads():
"""generate for non-blocking sleep"""
for k, t in webserver.app.config['test_threads'].items():
if t and t.is_alive():
yield tornado.gen.sleep(5)
else:
webserver.app.config['test_threads'][k] = None
def reload_hook():
"""wait for daemon threads to finish"""
while any(webserver.app.config['test_threads'].values()):
wait_on_threads()
rollback()
...
if __name__ == '__main__':
application.listen(address=ip, port=80)
tornado.autoreload.add_reload_hook(reload_hook)
tornado.autoreload.start()
try:
tornado.ioloop.IOLoop.instance().start()
except KeyboardInterrupt:
cleanup_handler()
webserver.app.logger.info('Exit success.')
tornado.ioloop.IOLoop.instance().stop()
Раньше я только что спит в перегрузочной крючок и работал, но сделал веб-страница не отвечает, когда я хотел бы сделать изменения. Потоки будут успешно завершены до перезагрузки, и после перезагрузки веб-сервер снова станет отзывчивым. Я попытался заменить сон неблокирующим методом, и снова он работает, но он ведет себя точно так же, поскольку веб-сервер блокирует и не будет реагировать до тех пор, пока не перезагрузится.
Я делаю это неправильно или является функцией автозагрузки, которая заставит веб-страницу терять отзывчивость в любом случае?
Это смерч Версия: 4.2.1 и 2.7.10 питон
Итак, да, автозагрузка reload_hook всегда собирается блокировать? – Wyrmwood
Правильно. reload_hook должна быть синхронной. –