【发布时间】:2013-05-07 20:44:29
【问题描述】:
在Tornado的chat demo中,有这样一个方法:
@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 机器上得到了相同的输出。
编辑:
我找到了一种方法 - 如果有人可以提供一种跨平台工作的方法(我不太担心性能,只是它是非阻塞的),我会接受这个答案。
【问题讨论】:
-
time.sleep阻止 Tornado IOLoop,这会停止所有处理。您根本不需要多个线程(尽管您可能希望它们在生产中使用),只是不要睡觉。相反,向 IOLoop 添加超时:tornadoweb.org/en/stable/… -
请选择dano和john提供的正确答案。
标签: python asynchronous tornado