2015-11-17 2 views
0

У меня есть веб-страница, которую я бы хотел перезагрузить, когда я вношу изменения, однако у меня могут быть потоки, которые я не хочу прерывать автозагрузкой. То, что у меня сейчас работает, в том, что потоки могут закончить, но после внесения изменений, но до перезагрузки веб-страница не отвечает, если я нажимаю на что-либо.Как реализовать неблокируемое ожидание в автозагрузке 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 питон

ответ

1

особенность автоперезагрузки для Tornado предназначен для использования в целях развития, когда вы не заботитесь о прерывании, что в ходе. (Если вы задерживаете перезагрузку, то либо сервер недоступен во время перезагрузки, либо вы можете продолжать добавлять работу в старый процесс, задерживая перезапуск на неопределенный срок). Чтобы перезапустить запущенную службу без сбоев, требуется более сложный процесс, в котором старые и новые службы перекрываются на короткий период.

Например, вы можете запускать два отдельных (набора) процессов и инструктировать балансировщик нагрузки для переноса трафика с одного на другой. Или вы можете вызвать HTTPServer.stop() в старых процессах, чтобы освободить порт, а затем оставить их запущенными, пока вы также запускаете новые процессы.

+0

Итак, да, автозагрузка reload_hook всегда собирается блокировать? – Wyrmwood

+0

Правильно. reload_hook должна быть синхронной. –

Смежные вопросы