我试图了解yield的目的,以在Tornado中启用异步操作,但是我不清楚为什么它不执行异步操作。为了简洁起见,我已略过导入,但此代码完整。这是我想要做的。当用户发出http获取请求时,我掷硬币。如果硬币变成正面,我会睡10秒钟并打印“你好正面”。如果硬币是尾巴,我会立即打印“ Hello Tails”。当我卷曲时,进入睡眠状态并再次卷曲,我注意到请求已排队(即使硬币是尾巴)。我期望第二个请求在其自己的线程中得到服务,并迅速返回“ Hello Tails”。我想念什么?
class MainHandler(tornado.web.RequestHandler):
@gen.coroutine
def get(self):
toss = random.choice(['H', 'T'])
print("flipped a coin, got", toss)
if toss == 'H':
response = yield time.sleep(10)
self.write("Hello Heads")
else:
self.write("Hello Tails")
if __name__ == "__main__":
tornado.options.parse_command_line()
application = tornado.web.Application([
(r"/", MainHandler),
])
application.listen(8888)
tornado.ioloop.IOLoop.current().start()
答案 0 :(得分:1)
time.sleep
是一项阻止功能。当您的代码到达此语句时,整个服务器(事件循环)将阻塞10秒钟。
因此,每个后续请求也会延迟到time.sleep
被解决为止。
使用time.sleep
-gen.sleep
的异步等效项。
Tornado文档的FAQs section中也提到了这一点。