停止一个龙卷风应用程序

4 投票
3 回答
2729 浏览
提问于 2025-04-18 07:10

我们来看一下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

这里有一个关于如何优雅且安全地关闭tornado的ioloop的简单介绍。

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

不过,你可以参考这个实现来达到你的目的。

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()

撰写回答