Что-нибудь особенное требуется, чтобы использовать метод data_received Торнадо без блокировки? - PullRequest
0 голосов
/ 30 января 2019

У меня есть обработчик POST-запроса, который принимает потоковые данные в качестве ввода и записывает их в API-интерфейсы AWS.Данные отправляются в AWS с использованием нескольких внутренних запросов, которые выполняются через boto3.Я полагаю, что boto3 блокирует, но может высвобождать GIL при выполнении операций ввода-вывода: кажется, он использует urllib3.connection для внутреннего использования.Поэтому я завернул его в вызов run_in_executor - что-то вроде этого сокращенного кода:

@stream_request_body
class Handler(RequestHandler):
    async def prepare(self):
        self.parser = BufferedParser()

    async def data_received(self, chunk):
        complete_part = self.parser.receive(chunk)
        if complete_part:
            await IOLoop.current().run_in_executor(
                None, self.send_via_boto, complete_part)

    async def post(self):
        self.set_header('Content-Type', 'text/plain')
        self.write("OK")

Мой вопрос: будет ли ожидаемый вызов send_via_boto заблокировать клиентаот загрузки следующего чанка?Нужно ли реализовывать что-то более оригинальное или это уже должно быть неблокирующим?

1 Ответ

0 голосов
/ 30 января 2019

"блокировать загрузку клиентом следующего фрагмента" - клиент загружает данные не непосредственно в ваше приложение, а в сокет TCP.Этот сокет имеет определенный размер, т.е. буфер, поэтому, если буфер заполнен, клиент будет ждать, пока он не будет очищен, и затем продолжит загрузку.Ваше приложение с помощью Tornado читает из этого буфера TCP-сокета и очищает его той частью, которая была прочитана.Процесс отправки чанка в AWS не остановит клиента от загрузки данных в TCP-сокет, даже если вы отправляете данные в AWS блокирующим способом (то есть без run_in_executor, но вы заблокируете свой сервер от обслуживания других запросов).Если вы отправляете данные в AWS медленнее, чем загрузка клиента, тогда ваше приложение будет узким местом и предотвратит (что технически не то же самое, что блокирование ) клиента от загрузки больше.

...