龙卷风异步收益
Tornado async yield
我想了解 yield 的目的是在 Tornado 中启用异步操作,但我不清楚为什么它不执行异步操作。为简洁起见,我跳过了导入,但此代码在其他方面是完整的。这就是我想要做的。当用户发出 http get 请求时,我抛硬币。如果硬币正面朝上,我会休眠 10 秒并打印 "Hello Heads"。如果硬币是反面我立即打印 "Hello Tails"。当我卷曲并进入睡眠状态并再次 运行 卷曲时,我注意到请求已排队(即使硬币是反面)。我期待第二个请求在它自己的线程中得到服务,并迅速 return "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()
time.sleep
是一个阻塞函数。当您的代码到达此语句时,整个服务器(事件循环)将阻塞 10 秒。
因此,每个后续请求也会延迟,直到 time.sleep
得到解决。
使用 time.sleep
的异步等价物 — gen.sleep
。
Tornado 文档的 FAQs section 中也提到了这一点。
我想了解 yield 的目的是在 Tornado 中启用异步操作,但我不清楚为什么它不执行异步操作。为简洁起见,我跳过了导入,但此代码在其他方面是完整的。这就是我想要做的。当用户发出 http get 请求时,我抛硬币。如果硬币正面朝上,我会休眠 10 秒并打印 "Hello Heads"。如果硬币是反面我立即打印 "Hello Tails"。当我卷曲并进入睡眠状态并再次 运行 卷曲时,我注意到请求已排队(即使硬币是反面)。我期待第二个请求在它自己的线程中得到服务,并迅速 return "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()
time.sleep
是一个阻塞函数。当您的代码到达此语句时,整个服务器(事件循环)将阻塞 10 秒。
因此,每个后续请求也会延迟,直到 time.sleep
得到解决。
使用 time.sleep
的异步等价物 — gen.sleep
。
Tornado 文档的 FAQs section 中也提到了这一点。