Я написал HTTP-сервер, который создает бесконечные потоки HTTP, состоящие из событий, структурированных в формате JSON. Подобно потоковому API Twitter. Эти события разделены \n
(согласно событиям, отправленным сервером с Content-Type:text /event-stream) и может различаться по длине.
Ответ
- фрагментировано (HTTP 1.1 Transfer-Encoding: фрагментировано) из-за бесконечного потока
- сжатый (Content-Encoding: gzip) для экономии полосы пропускания.
Я хочу использовать эти строки в Python, как только они появятся, и максимально эффективно использовать ресурсы, не изобретая велосипед.
Поскольку я сейчас использую python-запросы, знаете ли вы, как заставить его работать? Если вы думаете, что python-запросы здесь не помогут, я полностью открыт для альтернативных фреймворков/библиотек.
Моя текущая реализация основана на запросах и использует iter_lines(...)
для получения строк. Но параметр chunk_size
хитрый. Если установлено значение 1
, это сильно загружает процессор, поскольку некоторые события могут занимать несколько килобайт. Если установлено любое значение выше 1, некоторые события застревают до прихода следующего, и весь буфер «заполняется». А время между событиями может составлять несколько секунд. Я ожидал, что chunk_size
будет своего рода «максимальным количеством байтов для получения», как в recv(...)
в Unix. Соответствующая справочная страница гласит:
Вызовы получения обычно возвращают любые доступные данные вплоть до запрошенной суммы, а не ждут получения всей запрошенной суммы.
Но это явно не так, как это работает в библиотеке запросов. Они используют его более или менее как «точное количество байтов для получения». Глядя на их исходный код, я не мог определить, какая часть отвечает за это. Возможно, ответ httplib или SSLSocket ssl.
В качестве обходного пути я попытался дополнить свои строки на сервере кратным размеру фрагмента. Но размер фрагмента в библиотеке запросов используется для выборки байтов из сжатого потока ответов. Так что это не сработает, пока я не смогу дополнить свои строки так, чтобы их сжатая последовательность байтов была кратна размеру фрагмента. Но это кажется слишком хакерским.
Я читал, что Twisted можно использовать для неблокирующей и небуферизованной обработки http-потоков на клиенте, но я нашел код только для создания потоковых ответов на сервере.
requests
может обойти. - person Martijn Pieters   schedule 15.02.2014