2016-02-29 4 views
0

У меня есть установка Tornado для работы в качестве сервера Websocket, и она отлично работает.Tornado coroutines внутри websocket

Однако я хотел бы взять входящий поток данных на веб-узел, поставить его в очередь и загрузить его на второй сервер через HTTP-запрос POST с кодировкой с чередованием в реальном времени. Я использую библиотеку запросов python для выполнения POST (он поддерживает получение кусков из генератора).

Без сопроцессоров это не сработает - поскольку метод загрузки блокирует выполнение, поэтому новые входящие данные не добавляются в очередь до завершения загрузки.

Я добавил сопрограммы через некоторые декораторы в своих методах websocket, но теперь это не работает - ничто не загружается через HTTP POST. Я даже пытался добавить выход внутри make_request функции, как так (как «любой функция, которая вызывает сопрограмма должна быть сам по себе сопрограммной, и использовать ключевое слово выхода в вызове» в соответствии с Документами Торнадо):

data = yield self.read_queue() 

но это привело к синтаксической ошибке. Пример кода here.

Я нахожусь на Python 3.4.

ответ

1

Библиотека requests является синхронной. Вы не должны использовать его из Tornado, за исключением запуска его в поток. Использование requests в потоке в этом случае было бы более сложным, чем типичное использование ThreadPoolExecutor в Tornado, потому что вы будете подавать данные в него во время его работы, и у вас могут быть проблемы, если пул потоков был исчерпан.

Вместо этого используйте Tornado's AsyncHTTPClient. Аргумент body_producer позволяет загружать куски по мере их поступления.

Смежные вопросы