Иногда я хочу, чтобы интерактивные пользователи отображали логику в сопроводительных документах торнадо. Эти пользователи часто нажимают Ctrl-C
для прерывания длительных вычислений. Это помещает IOLoop в несчастливое состояние для будущих взаимодействий.Закрыть и сбросить Tornado IOLoop после KeyboardInterrupt
In [1]: from tornado import gen
In [2]: from tornado.ioloop import IOLoop
In [3]: IOLoop.current().run_sync(lambda: gen.sleep(100000))
KeyboardInterrupt:
In [4]: IOLoop.current().run_sync(lambda: gen.sleep(1))
RuntimeError: IOLoop is already running
Какие операции я должен делать между [3]
и [4]
, чтобы очистить или заменить застрял IOLoop. Некоторая комбинация .stop
, .close
, .close_current
и .close_instance
работала для меня в прошлом.
Чтобы быть ясным, я не хочу повторно активировать текущий IOLoop. Я был бы вполне доволен отказом от него и созданием нового. – MRocklin
А, это намного проще. Вы можете попытаться вызвать 'close()' на старом, но будьте готовы к исключению. Вызов 'install()' (если предыдущим IOLoop был 'instance()') и 'make_current()' должно быть достаточно, чтобы заменить старый. Но это все еще может измениться в будущих версиях Tornado; единственным способом, который действительно гарантированно быть безопасным, является замена обработчика сигнала тем, что не вызывает 'KeyboardInterrupt'. –