Асинхронный торнадо
Есть простой 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 - значение которое вы в неё передадите.