Остановка торнадо из ниток - PullRequest
0 голосов
/ 05 июня 2018

Я использую торнадо и наблюдаю за различными источниками данных и т. Д. Из отдельного потока.В этом случае важно закрыть веб-сервер, если пользователь закрывает браузер.Я просто полагаюсь на запросы сердцебиения из браузера, а затем хочу остановить торнадо ioloop.Это оказывается очень трудным:

# Start the main processing loop
mLoop = threading.Thread(target = mainLoop, args=())
mLoop.start()

# Set up webserver
parser = argparse.ArgumentParser(description="Starts a webserver.")
parser.add_argument("--port", type=int, default=8000, help="The port")
args = parser.parse_args()

handlers = [(r"/", IndexHandler), (r"/websocket", WebSocket),
            (r'/static/(.*)', tornado.web.StaticFileHandler,
             {'path': os.path.normpath(os.path.dirname(__file__))})]
application = tornado.web.Application(handlers)
application.listen(args.port)

webbrowser.open("http://localhost:%d/" % args.port, new=2)

tornado.ioloop.IOLoop.instance().start()

Основной цикл должен, в определенных условиях, остановить торнадо, но он не может получить доступ к ioloop для вызова IOLoop.stop () (или, возможно, лучшего IOLoop.instance)..stop ()) потому что это не тот поток, который его запустил.

Какой лучший способ сделать это?

1 Ответ

0 голосов
/ 28 августа 2019

application.listen возвращает экземпляр HTTPServer, который можно остановить, закрывая сокет / порт.Затем закройте экземпляр IOLoop.

from tornado.web import Application
from tornado.ioloop import IOLoop

# starting
application = Application(...)
server = application.listen(args.port)
# depends on your use-case
eventLoopThread = Thread(target=IOLoop.current().start)
eventLoopThread.daemon = True
eventLoopThread.start()

# stopping
server.stop()
IOLoop.current().stop()
...