【问题标题】:Tornado async yield龙卷风异步收益率
【发布时间】:2019-05-07 08:40:41
【问题描述】:

我试图了解 yield 在 Tornado 中启用异步操作的目的,但我不清楚它为什么不执行异步操作。为简洁起见,我跳过了导入,但这段代码是完整的。这是我想要做的。当用户发出 http get 请求时,我掷硬币。如果硬币转头,我会睡 10 秒并打印“Hello Heads”。如果硬币是反面,我会立即打印“Hello Tails”。当我进行 curl 并进入睡眠状态并再次运行 curl 时,我注意到请求已排队(即使硬币是反面)。我期待第二个请求在它自己的线程中得到服务并快速返回“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()

【问题讨论】:

    标签: python asynchronous tornado


    【解决方案1】:

    time.sleep 是一个阻塞函数。当您的代码到达此语句时,整个服务器(事件循环)会阻塞 10 秒。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多