Замена python httplib?

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

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

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

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

Итак, если у вас есть опыт использования лучших клиентских библиотек HTTP на python, расскажите мне об этом. Я хотел бы знать, что вы думаете о производительности относительно httplib и о том, что вы думаете о качестве реализации.

UPDATE 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.

Ответ 1

Часто, когда у меня были проблемы с производительностью с 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 или что угодно, но если вы делаете несколько запросов с разных серверов, вы можете повысить производительность, выполнив их параллельно.

Ответ 2

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

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

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

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

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

Ответ 3

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

Ответ 4

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

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


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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

Он работает на моей машине 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