停止一个龙卷风应用程序
我们来看一下Tornado主页上的“你好,世界”应用:
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
application = tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
有没有办法在IOloop启动后,不停止它的情况下,基本上停止当前的应用,然后启动另一个应用(可以在同一个端口上,也可以在不同的端口上)?
我看到可以在运行时添加新的应用(监听不同的端口),但我不知道怎么才能停止已经存在的应用。
3 个回答
2
在几年前,@Alex Shkop的回答中提到的内容,现在有了新的进展。根据Tornado 4.3版本,.listen()
这个方法现在会返回它的 HTTPServer
的引用!
你可以在这里查看详细信息:https://www.tornadoweb.org/en/stable/web.html#tornado.web.Application.listen
server = app.listen()
... # later
server.stop()
另外,如果你在Jupyter笔记本中工作,并且出于某种原因需要一个Tornado服务器,你可以尝试在重新创建服务器之前先关闭 HTTPServer
,这样可以避免在重新运行单元时出现 OSError: [Errno 98] Address already in use
的错误。
# some Jupyter cell
#
import tornado.web
try:
server.stop() # NameError on first cell run
except Exception as ex:
print(f"server not started to stop: {repr(ex)}")
else: # did not raise NameError: server was running
print(f"successfully stopped server: {server}")
app = tornado.web.Application(...)
server = app.listen(9006) # arbitrary listening port
2
7
Application.listen()
这个方法实际上是创建了一个 HTTPServer
,并调用了它的 listen()
方法。HTTPServer
对象有一个 stop()
方法,这个方法可能正是你需要的。不过,要使用这个方法,你必须在你的脚本中明确地创建一个 HTTPServer
对象。
server = HTTPServer(application)
server.listen(8888)
tornado.ioloop.IOLoop.instance().start()
#somewhere in your code
server.stop()