Замена для httplib Python? - PullRequest
       32

Замена для httplib Python?

10 голосов
/ 03 февраля 2009

У меня есть клиент Python, который передает большой объем данных через httlib стандартной библиотеки. Пользователи жалуются, что приложение работает медленно. Я подозреваю, что это может быть частично из-за клиента HTTP, который я использую.

Могу ли я улучшить производительность, заменив httplib чем-то другим?

Я видел, что Twisted предлагает HTTP-клиент. Похоже, что это очень простой по сравнению с другими предложениями протокола.

PyCurl может быть допустимой альтернативой, однако его использование кажется весьма непитонным, с другой стороны, если его производительность действительно хорошая, тогда я могу смириться с небольшим количеством непитонического кода.

Так что, если у вас есть опыт работы с лучшими HTTP-библиотеками Python, пожалуйста, расскажите мне об этом. Я хотел бы знать, что вы думаете о производительности по отношению к httplib и что вы думаете о качестве реализации.

ОБНОВЛЕНИЕ 0: мое использование httplib на самом деле очень ограничено - для замены необходимо выполнить следующее:

conn = httplib.HTTPConnection(host, port)
conn.request("POST", url, params, headers)
compressedstream = StringIO.StringIO(conn.getresponse().read())

Вот и все: никаких прокси, перенаправления или каких-либо необычных вещей. Это обычный старый HTTP. Мне просто нужно быть в состоянии сделать это как можно быстрее.

ОБНОВЛЕНИЕ 1: Я застрял на Python2.4 и работаю на Windows 32. Пожалуйста, не говорите мне о лучших способах использования httplib - я хочу знать о некоторых альтернативах httplib.

Ответы [ 8 ]

22 голосов
/ 03 февраля 2009

Часто, когда у меня возникали проблемы с производительностью httplib, проблема была не в самом httplib, а в том, как я его использую. Вот несколько распространенных ошибок:

(1) Не устанавливайте новое TCP-соединение для каждого веб-запроса. Если вы делаете много запросов на один и тот же сервер, вместо этого шаблона:

    conn = httplib.HTTPConnection("www.somewhere.com")
    conn.request("GET", '/foo')
    conn = httplib.HTTPConnection("www.somewhere.com")
    conn.request("GET", '/bar')
    conn = httplib.HTTPConnection("www.somewhere.com")
    conn.request("GET", '/baz')

Сделайте это вместо:

    conn = httplib.HTTPConnection("www.somewhere.com")
    conn.request("GET", '/foo')
    conn.request("GET", '/bar')
    conn.request("GET", '/baz')

(2) Не сериализуйте свои запросы. Вы можете использовать потоки или asynccore или что угодно, но если вы делаете несколько запросов с разных серверов, вы можете улучшить производительность, запустив их параллельно.

19 голосов
/ 03 февраля 2009

Пользователи жалуются, что приложение работает медленно. Я подозреваю, что это может быть частично из-за клиента HTTP, который я использую.

Могу ли я улучшить производительность, заменив httplib чем-то другим?

Вы подозреваете это или вы уверены , что это httplib? Профиль, прежде чем что-либо делать, чтобы улучшить производительность вашего приложения.

Я обнаружил, что моя собственная интуиция в отношении того, как тратится время, часто бывает довольно плохой (учитывая, что не существует какого-либо ядра кода, выполняемого миллионы раз). Это действительно разочаровывает, если что-то реализует для повышения производительности, а затем запускает приложение и видит, что это не имеет значения.

Если вы не профилируете, вы снимаете в темноте!

5 голосов
/ 04 февраля 2009

PyCurl потрясающий, и чрезвычайно высокая производительность.

2 голосов
/ 04 февраля 2009

httplib2 - это еще один вариант: http://code.google.com/p/httplib2/

Я никогда не сравнивал и не анализировал его по сравнению с httplib, но мне также были бы интересны любые находки там.


Декабрь Обновление 2012: Я больше не использую httplib2. теперь используется Запросы : HTTP для людей, для любого http с Python.

1 голос
/ 05 февраля 2009

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

Альтернативой, которая может фактически дать вам повышение производительности для POST, особенно в Windows, является новый клиент HTTP 1.1 в Twisted.web

1 голос
/ 03 февраля 2009

Вы, кажется, предполагаете, что это библиотека. Это открытый исходный код, поэтому стоит проверить код, чтобы убедиться, что он есть.

Вы упоминаете, что отправляете много данных по HTTP. Неэффективность может быть из-за библиотеки, но HTTP не самый эффективный протокол для отправки больших объемов данных. Опять же, это может быть простое использование библиотеки (отправляете ли вы большую строку или список, или используете поток или генераторы?).

0 голосов
/ 21 июля 2011

Это работает на моем компьютере с Windows: В Py 2.3 (без поддержки IPv6) это только адрес IPv4, но с Py 2.4-2.6 порядок (на моем хосте Win XP) адрес IPv6 сначала адрес IPv4. Поскольку адрес IPv6 проверяется первым, это дает тайм-аут и вызывает медленный вызов connect ().

Я только изменил «localhost» на 127.0.0.1, и он начал работать в 10 раз быстрее (с 1087 мс до 87 мс). Решение от http://www.velocityreviews.com/forums/t668272-problem-with-slow-httplib-connections-on-windows-and-maybe-otherplatforms.html

0 голосов
/ 04 февраля 2009

httplib2 - очень хороший вариант. Джо Грегорио исправил много ошибок httplib.

...