无法让Tornado webserver成为线程代码

时间:2011-06-02 01:54:42

标签: python multithreading tornado

刚刚开始使用Tornado,不知道我出了什么问题,但我根本无法解决它,这是我正在测试的代码。

    import tornado.ioloop
    import tornado.web
    import time
    from threading import Timer

    class MainHandler(tornado.web.RequestHandler):
        @tornado.web.asynchronous
        def get(self):
            t = Timer(5.0, self.on_response)
            t.start()
            print 'thread started'

        def on_response(self):
            self.write(str(time.time()))
            self.finish()

    application = tornado.web.Application([
        (r"/", MainHandler),
    ])

    if __name__ == "__main__":
        application.listen(8888)
        tornado.ioloop.IOLoop.instance().start()

如果我运行它,它可以工作,但它会阻止整个网络服务器5秒钟,所以如果我尝试快速连续加载这个页面两次,它将打印'thread started',等待5秒,第一个浏览器将加载,然后它将再次打印'thread started',再等5秒,然后发送第二个浏览器页面,总共需要10秒。

即使在龙卷风网站上运行非阻塞示例,我也遇到了这个问题。有什么想法吗?

尝试使用python 2.6和2.7,来自easy_install的Tornado 1.2.1。

2 个答案:

答案 0 :(得分:1)

您发布的代码按照我的预期工作,使用Snow Leopard上的Python 2.6.1。您是否尝试过使用curl进行测试?:

curl --no-buffer localhost:8888 & curl --no-buffer localhost:8888

答案 1 :(得分:-1)

  1. 我尝试使用2个标签中的chrome。这需要大约10秒钟。
  2. 我在2个标签中尝试使用IE9。这需要大约5秒钟。
  3. 写一个网页,逐个向URL发送2个AJAX请求(带有无意义的查询参数以避免浏览器缓存),大约需要5秒钟。
  4. 如您所见,卷曲也会在5秒左右起作用。
  5. 所以,这可能是浏览器/客户端指定的行为让我们感到困惑。