让我们在Tornado主页中获取hello world应用程序:
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并且没有停止之后,有没有办法基本上停止应用程序并启动另一个应用程序(在同一个端口或另一个端口上)?
我看到我可以在运行时添加新的应用程序(在不同的端口上侦听),但我不知道如何阻止现有的应用程序。
答案 0 :(得分:4)
Application.listen()
方法实际创建了HTTPServer
并调用其listen()
方法。 HTTPServer
个对象具有stop()
方法,这可能就是您所需要的。但是为了做到这一点,你必须在脚本中显式创建HTTPServer
对象。
server = HTTPServer(application)
server.listen(8888)
tornado.ioloop.IOLoop.instance().start()
#somewhere in your code
server.stop()
答案 1 :(得分:2)
答案 2 :(得分:1)
几年后添加到 @Alex Shkop's answer,从 Tornado 4.3 开始,.listen()
返回对其 HTTPServer
的引用!
https://www.tornadoweb.org/en/stable/web.html#tornado.web.Application.listen
server = app.listen()
... # later
server.stop()
此外,如果您在 Jupyter notebook 中工作并且出于某种原因需要 Tornado 服务器,您可以在重新创建之前 try
关闭 HTTPServer
以避免 OSError: [Errno 98] Address already in use
重新运行单元
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:
print(f"successfully stopped server: {server}")
app = tornado.web.Application(...)
server = app.listen(9006)