在 Tornado 的 聊天室示例 中,有一个类似这样的方法:
相反,我看到
这让我相信,在这种情况下它确实是阻塞的。我的代码为什么会阻塞,我该如何使代码达到预期效果?我在Windows 7上使用core i7和linux Mint 13盒子上获得了相同的输出,其中我认为有两个核心。
编辑:
我找到了一种方法 - 如果有人能提供一个跨平台的方法(我不太担心性能,只要它是非阻塞的),我会接受那个答案。
@tornado.web.asynchronous
def post(self):
cursor = self.get_argument("cursor", None)
global_message_buffer.wait_for_messages(self.on_new_messages,
cursor=cursor)
我对这个长轮询的东西还比较陌生,而且我不太明白线程的工作原理,尽管它说:
通过使用非阻塞网络I/O,Tornado可以扩展到成千上万个打开的连接......
我的理论是通过制作一个简单的应用程序:
import tornado.ioloop
import tornado.web
import time
class MainHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
print("Start request")
time.sleep(4)
print("Okay done now")
self.write("Howdy howdy howdy")
self.finish()
application = tornado.web.Application([
(r'/', MainHandler),
])
如果我连续发送两个请求(比如我打开了两个浏览器窗口并快速刷新),我会看到这个:
Start request
Start request
Okay done now
Okay done now
相反,我看到
Start request
Okay done now
Start request
Okay done now
这让我相信,在这种情况下它确实是阻塞的。我的代码为什么会阻塞,我该如何使代码达到预期效果?我在Windows 7上使用core i7和linux Mint 13盒子上获得了相同的输出,其中我认为有两个核心。
编辑:
我找到了一种方法 - 如果有人能提供一个跨平台的方法(我不太担心性能,只要它是非阻塞的),我会接受那个答案。
time.sleep
阻塞了 Tornado IOLoop,从而停止了所有处理。你根本不需要多个线程(尽管在生产中可能需要),只需不要睡眠即可。相反,向 IOLoop 添加超时:http://www.tornadoweb.org/en/stable/ioloop.html#tornado.ioloop.IOLoop.add_timeout - Cole Maclean