Асинхронный торнадо

Есть простой http обработчик

import tornado.ioloop
import tornado.web
import time

class MainHandler(tornado.web.RequestHandler):
    def post(self):
        time.sleep(5)
        self.write("Hello, world")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

Как сделать асинхронное выполнение,что бы при одновременных запросах, вместо простоя в 5 сек, программа начинала обрабатывать следующий запрос


Ответы (1 шт):

Автор решения: 5c0rp

Замените MainHandler на

class MainHandler(tornado.web.RequestHandler):
    async def post(self):
        await tornado.gen.sleep(5)
        self.write("Hello, world")

либо, если tornado запущен на asyncio

class MainHandler(tornado.web.RequestHandler):
    async def post(self):
        await asyncio.sleep(5)
        self.write("Hello, world")

Пример с executor

class MainHandler(tornado.web.RequestHandler):
    async def post(self):
        await IOLoop.current().run_in_executor(None, time.sleep, 1)
        self.write("Hello, world")

тут вместо time.sleep будет ваша функция, а вместо 1 - значение которое вы в неё передадите.

→ Ссылка