Торнадо асинхронный выход - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь понять цель выхода, чтобы включить асинхронные операции в Торнадо, но мне не ясно, почему он не выполняет асинхронную работу. Я пропустил импорт для краткости, но этот код завершен иначе. Вот что я пытаюсь сделать. Когда пользователь делает запрос http, я подбрасываю монету. Если монета поворачивает головы, я сплю 10 секунд и печатаю «Hello Heads». Если монета - это хвосты, я сразу же печатаю «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 Ответ

1 голос
/ 07 мая 2019

time.sleep является функцией блокировки.Когда ваш код достигает этого оператора, весь сервер (цикл обработки событий) блокируется на 10 секунд.

Таким образом, каждый последующий запрос также задерживается до разрешения time.sleep.

Используйте асинхронный эквивалент time.sleep - gen.sleep.

Это также упоминается в разделе часто задаваемых вопросов документации Tornado.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...