龙卷风异步产量

时间:2019-05-07 08:40:41

标签: python asynchronous tornado

我试图了解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()

1 个答案:

答案 0 :(得分:1)

time.sleep是一项阻止功能。当您的代码到达此语句时,整个服务器(事件循环)将阻塞10秒钟。

因此,每个后续请求也会延迟到time.sleep被解决为止。

使用time.sleep-gen.sleep的异步等效项。

Tornado文档的FAQs section中也提到了这一点。