Вопрос

У меня есть клиент 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.

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

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


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

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

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

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

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

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

Он работает на моей машине с Windows:С PY 2.3 (без поддержки IPv6) это только адрес IPv4, но с PY 2.4-2.6 порядок (на моем хосте Win XP) сначала адрес IPv6, затем адрес IPv4.Поскольку адрес IPv6 проверяется в первую очередь, это дает тайм -аут и вызывает вызов Mlow 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top