Я хочу написать простой асинхронный HTTP-сервер с Tornado. Мне непонятно, как установить обратный вызов, чтобы освободить сервер для дополнительных запросов во время обработки текущего запроса.Простой асинхронный сервер с торнадо Python
Код я написал это:
import tornado.web
from tornado.ioloop import IOLoop
from tornado import gen
import time
class TestHandler(tornado.web.RequestHandler):
@gen.coroutine
def post(self, *args, **kwargs):
json_input = tornado.escape.json_decode(self.request.body)
print ('Now in POST. body: {}'.format(json_input))
self.perform_long_task(*args, **json_input)
@gen.coroutine
def perform_long_task(self, **params):
time.sleep(10)
self.write(str(params))
self.finish()
application = tornado.web.Application([
(r"/test", TestHandler),
])
application.listen(9999)
IOLoop.instance().start()
Для проверки я попытался отправить несколько запросов POST параллельно:
curl -v http://localhost:9999/test -X POST -H "Content-Type:appication/json" -d '{"key1": "val1", "key2": "val2"}' &
В настоящее время сервер заблокирован во время perform_long_task() обрабатывается. Мне нужна помощь, чтобы сервер был неблокирующим.
Я думаю, вы хотите ['gen.sleep'] (http://www.tornadoweb.org/en/stable/gen.html#tornado.gen.sleep) вместо' time.sleep' на своем пути к запись асинхронного кода –
«Сон» - это просто отложить обработку запроса в этом примере. Я ожидаю, что этот окончательный код будет иметь процесс реального времени. – Yuval
Прочитайте эту функциональную документацию. * это неблокирующий аналог time.sleep (который не должен использоваться в сопрограммах, поскольку он блокируется) * –