为什么'tornado.ioloop.IOLoop.instance().start()'给我一个错误?

Rob*_*rtB 5 python tornado python-3.x

我是龙卷风的新手.我构建了这个非常基本的龙卷风请求处理程序,我希望在GET上返回"Hello World":

import tornado
import tornado.web

class HelloWorldHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous 
    def get(self, *args):
        self.write("Hello World")
        self.finish() 

if __name__=="__main__":
    app = tornado.web.Application([
        (r'/help', HelloWorldHandler),
    ], cookie_secret="__SHH_DONT_TELL__")

    app.listen(5001)
    tornado.ioloop.IOLoop.instance().start()
Run Code Online (Sandbox Code Playgroud)

但当我运行它时,我得到:

Traceback (most recent call last):

  File "<ipython-input-1-4bf86d0b596e>", line 1, in <module>
    runfile('D:/Python/notebooks/my_tornado/temp.py', wdir='D:/Python/notebooks/my_tornado')

  File "C:\WinPython-64bit-3.5.2.3\python-3.5.2.amd64\lib\site-packages\spyder\utils\site\sitecustomize.py", line 866, in runfile
    execfile(filename, namespace)

  File "C:\WinPython-64bit-3.5.2.3\python-3.5.2.amd64\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "D:/Python/notebooks/my_tornado/temp.py", line 23, in <module>
    tornado.ioloop.IOLoop.instance().start()

  File "C:\WinPython-64bit-3.5.2.3\python-3.5.2.amd64\lib\site-packages\zmq\eventloop\ioloop.py", line 162, in start
    super(ZMQIOLoop, self).start()

  File "C:\WinPython-64bit-3.5.2.3\python-3.5.2.amd64\lib\site-packages\tornado\ioloop.py", line 752, in start
    raise RuntimeError("IOLoop is already running")

RuntimeError: IOLoop is already running
Run Code Online (Sandbox Code Playgroud)

但是,它似乎工作.当我点击http://localhost:5001/helpChrome时,我得到:

你好,世界

如果我杀了它并注释掉最后一行(#tornado.ioloop.IOLoop.instance().start()),那么

  1. 我没有得到错误
  2. 它看起来似乎一切正常.

所有的文档都说我需要最后一行,但似乎并不像我这样做.我应该把它关掉吗?任何人都可以解释为什么我看到这个?

注1:app.listen的'help'明确指出:

请注意,调用此方法后,您仍需要调用
IOLoop.current().start()以启动服务器.

但是,如果我使用current()instance()在文档中的其他地方,我会收到错误,instance()在这种情况下,首选使用.

注2:我绝对没有运行tornado该程序的另一个实例.当我对系统进行干净启动然后运行代码时会发生这种情况.我正在使用IronPython控制台在Spyder中运行代码,不确定它是否重要.

更新:我在运行python2的docker中的AWS上运行此脚本.我没有看到任何错误(不确定它们是否被抑制.)似乎这是特定于我的Windows安装?我正在使用最新的龙卷风运行更新的WinPython.

A. *_*vis 5

IPython笔记本已经在运行Tornado IOLoop.这就是为什么你看到"IOLoop已经运行"的错误.您还会注意到IPython已经配置了一种特殊的循环ZMQIOLoop,它不是Tornado的默认循环类型.

在开发和测试Tornado Web应用程序时,最好不要使用IPython.

  • 好吧,这就解释了。它符合我正在经历的事情。我不知道。我正在使用 Spyder,所以我可以使用“Python”控制台或“IPython”控制台,使用前者,它可以正常工作,不会出现错误,使用后者会出现错误。 (2认同)