簡體   English   中英

為什么'tornado.ioloop.IOLoop.instance()。start()'給我一個錯誤?

[英]Why is 'tornado.ioloop.IOLoop.instance().start()' giving me an error?

我是龍卷風的新手。 我構建了這個非常基本的龍卷風請求處理程序,我期望它將在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()

但是當我運行它時,我得到:

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

但是,它似乎有效。 當我從Chrome瀏覽器訪問http://localhost:5001/help時,我得到:

你好,世界

如果我殺死它並注釋掉最后一行( #tornado.ioloop.IOLoop.instance().start() ),那么

  1. 我沒有得到錯誤
  2. 似乎一切正常。

所有文檔都說我需要最后一行,但似乎並不需要。 我應該離開它嗎? 誰能解釋我為什么看到這個?

注意1:app.listen的“幫助”明確指出:

請注意,調用此方法后,您仍然需要調用
IOLoop.current().start()啟動服務器。

但是,如果我使用current()instance()並且在文檔的其他地方說在這種情況下首選使用instance()則會出現錯誤。

注意2:我絕對不會運行tornado或該程序的另一個實例。 當我執行系統的干凈啟動然后運行代碼時,會發生這種情況。 我正在用IronPython控制台在Spyder內運行代碼,不確定那是否重要。

更新:我在運行python2的docker中在AWS上運行了此腳本。 我沒有看到任何錯誤(不確定是否只是被抑制了。)似乎這是我的Windows安裝所特有的? 我正在使用最新的龍卷風運行更新的WinPython。

IPython Notebook已經在運行Tornado IOLoop。 這就是為什么您看到“ IOLoop已經運行”錯誤的原因。 您還將注意到,IPython配置了一種特殊的循環ZMQIOLoop,它不是Tornado的默認循環類型。

在開發和測試Tornado Web應用程序時,最好不要使用IPython。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM