@rail01y

Как заставить торнадо не блокировать IO?

Доброго времени суток, можете подсказать, почему торнадо лочит IO при выполнении следующего кода:
import time
import tornado.web
from tornado.ioloop import IOLoop
from tornado import gen
from tornado.concurrent import run_on_executor
from concurrent.futures import ThreadPoolExecutor

MAX_WORKERS = 4


class TestHandler(tornado.web.RequestHandler):
    executor = ThreadPoolExecutor(max_workers=MAX_WORKERS)

    @run_on_executor
    def background_task(self, i):
        """ This will be executed in `executor` pool. """
        time.sleep(10)
        return i

    @tornado.gen.coroutine
    def get(self):
        """ Request that asynchronously calls background task. """
        print('%s news handler accept' % time.time())
        res = yield self.background_task(time.time())
        self.write(str(res))


application = tornado.web.Application([
    (r"/", TestHandler),
])

application.listen(8888)
IOLoop.instance().start()


про gen.sleep знаю, но как заставить этот код не блокировать приложуху?
  • Вопрос задан
  • 377 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Я кажется знаю, что у вас происходит. С кодом у вас всё в порядке, не в порядке с методом тестирования. Наверняка вы открываете две вкладки в одном браузере и отправляете запросы из них. Но ни Google Chrome, ни Mozila Firefox не будут отправлять второй запрос на тот же адрес, пока не получат ответ на первый. Даже если запустить два окна. А вот IE11 без проблем отправляет одновременно два запроса на один адрес из вкладок. Попробуйте запустить два разных браузера, а ещё лучше используйте для тестов curl.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы