无法让Tornado webserver支持线程代码

1 投票
2 回答
712 浏览
提问于 2025-04-16 18:48

我刚开始学习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秒钟。所以如果我快速加载这个页面两次,它会先打印“线程开始”,然后等5秒,之后第一个浏览器才会加载页面,然后又会打印“线程开始”,再等5秒,最后才把页面发送给第二个浏览器,这样总共就花了10秒钟。

即使是运行Tornado官网上的非阻塞示例,我也遇到了这个问题。有没有什么建议?

我尝试过Python 2.6和2.7,使用的是easy_install安装的Tornado 1.2.1。

2 个回答

-1
  1. 我用Chrome浏览器打开了两个标签页,结果大约花了10秒钟。
  2. 我用IE9浏览器打开了两个标签页,结果大约花了5秒钟。
  3. 我写了一个网页,依次发送了两个AJAX请求到同一个网址(为了避免浏览器缓存,我用了无意义的查询参数),结果大约花了5秒钟。
  4. 正如你发现的,使用curl命令也差不多是5秒钟。

所以,这可能是浏览器或客户端特定的行为,让我们感到困惑。

1

你发的代码在我这边运行得很好,我用的是Python 2.6.1和Snow Leopard系统。你有没有试过用curl来测试一下呢?

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

撰写回答