在 Tornado 的聊天演示中,它有一个这样的方法:
@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
这让我相信它实际上是在这种情况下阻塞。为什么我的代码被阻塞了,我怎样才能得到一些代码来做我期望的事情?我在带有 i7 核心的 Windows 7 和带有我认为两个核心的 linux Mint 13 盒子上得到了相同的输出。
编辑:
我找到了一种方法 - 如果有人可以提供一种跨平台工作的方法(我不太担心性能,只是它是非阻塞的),我会接受这个答案。