停止龙卷风应用程序

时间:2014-05-21 08:44:57

标签: python tornado

让我们在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并且没有停止之后,有没有办法基本上停止应用程序并启动另一个应用程序(在同一个端口或另一个端口上)?

我看到我可以在运行时添加新的应用程序(在不同的端口上侦听),但我不知道如何阻止现有的应用程序。

3 个答案:

答案 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)

这是关于如何优雅安全地关闭龙卷风ioloop的要点。

https://gist.github.com/nicky-zs/6304878

但是,您可以参考此实现来实现您的目标。

答案 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)
相关问题