无法让Tornado webserver支持线程代码
我刚开始学习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
- 我用Chrome浏览器打开了两个标签页,结果大约花了10秒钟。
- 我用IE9浏览器打开了两个标签页,结果大约花了5秒钟。
- 我写了一个网页,依次发送了两个AJAX请求到同一个网址(为了避免浏览器缓存,我用了无意义的查询参数),结果大约花了5秒钟。
- 正如你发现的,使用curl命令也差不多是5秒钟。
所以,这可能是浏览器或客户端特定的行为,让我们感到困惑。
1
你发的代码在我这边运行得很好,我用的是Python 2.6.1和Snow Leopard系统。你有没有试过用curl来测试一下呢?
curl --no-buffer localhost:8888 & curl --no-buffer localhost:8888