Почему я не могу делать одновременные запросы в Торнадо? - PullRequest
0 голосов
/ 24 мая 2018

Ниже приложение Торнадо имеет 2 конечных точки.Один (/) медленный, потому что он ожидает операции ввода-вывода, а другой (/ hello) быстрый.Мое требование состоит в том, чтобы сделать запрос к обоим конечным точкам одновременно. Я заметил, что он принимает 2-й запрос только после того, как он завершает 1-й.Несмотря на то, что он асинхронный, почему он не может обрабатывать оба запроса одновременно?Как заставить его обрабатывать одновременно?

Редактировать: Я использую Windows 7, Eclipse IDE

****************Module*****************
import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    def get(self):
        self.do_something()
        self.write("FINISHED")
        self.finish()

    def do_something(self):
        inp = input("enter to continue")
        print (inp)
class HelloHandler(tornado.web.RequestHandler):

    def get(self):
        print ("say hello")
        self.write("Hello bro")
        self.finish(
def make_app():
    return tornado.web.Application([
    (r"/", MainHandler),
    (r"/hello", HelloHandler)
])
if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

1 Ответ

0 голосов
/ 24 мая 2018

Это асинхронно, только если вы сделаете это так.Сервер Tornado работает в одном потоке.Если этот поток заблокирован синхронным вызовом функции, то в этом потоке больше ничего не произойдет.@tornado.web.asynchronous позволяет использовать генераторы:

@tornado.web.asynchronous
def get(self):
    yield from self.do_something()
    ^^^^^^^^^^

Эта yield / yield from (в текущих версиях Python await) функция приостанавливает функцию и позволяет другимкод выполняется в том же потоке, в то время как асинхронный вызов завершается в другом месте (например, ожидание данных из базы данных, ожидание сетевого запроса для возврата ответа).То есть, если Python не должен активно что-то делать, но ожидает завершения внешних процессов, он может уступать вычислительной мощности другим задачам.Но поскольку ваша функция очень сильно работает на переднем плане и блокирует поток, больше ничего не произойдет.

См. http://www.tornadoweb.org/en/stable/guide/async.html и https://docs.python.org/3/library/asyncio.html.

...