Pull to refresh

Comments 19

Простой.

Спасибо, забыл про него — нужно будет проверить
Кстати, в торнадо как раз есть AsyncHTTPClient, использующий CURL Multi.

Это я так, чтобы время лишнее не тратили.
curl multi для этого случая подходит.

но если в программе уже есть свой event loop, то использовать curl multi не получится.
reactor засчитывается как event loop?
да, rector это pattern. суть — event loop.
Да я в курсе, просто уточнить, что мы имеем ввиду одно и тоже.

То есть получается что curl multi — в пролете?

и
— либо httplib
— либо deferred?
> а максимальное — в два раза, чем у блокирующего.

Советую перечитывать статьи перед публикацией.
Я один не понял что на графиках?
Зачем делать 100 запросов в 200 потоках?
И вообще так понял что вы сравниваете несколько последовательных запросов на PyCurl с несколькими одновременными на Twisted? Это как-то бессмысленно получается. Или PyCurl разнесли на несколько тредов?
Нет, в одном треде (если я правильно понял)
Какой смысл использовать PyCurl для множества запросов без PyCurl.Multi? После таких «тестов» все будут думать, что PyCurl отстой, когда он может тысячи запросов в секунду делать. Только (ВАЖНО!!) PyCurl Multi должен быть скомпилирован с библиотекой (c-ares) — это очень важно. По скорости можно сказать так: PyCurl обычный (медленно), PyCurlMulti (быстрее, но все еще медленно из-за синхронных DNS запросов), PyCurl+c-ares (предесльно быстро).

Дело в том, что на DNS запросы тратится тоже время и в синхронном режиме DNSы обычно (из опыта) могут выдавать только десятки ответов в секунду. В асинхронном режиме запросов (чем и занимается c-ares!) DNSы могут выдавать сотни и под тысячу ответов. Так что скорость растет в десяток раз минимум.

Важно: по умолчанию PyCurl под linux скомпилированы без c-ares. Проверка 'import pycurl; print pycurl.version' — если в выдаваемой строке есть 'c-ares' -скорость будет максимальной при использовании PyCurl.Multi. (Я дико долго искал почему винда на домашнем компе делает сотни запросов в секунду, а сервер в датацентре только десятки — разница была в наличии «c-ares») Под виндой .exe установщик обычно включает в себя c-ares.

PyCurl.Multi тоже не так прост, как кажется — даже в официальном multi_get примере есть ошибка (не помню точно ее суть, но по-моему он не будет качать больше 100 запросов — очередь неправильно реализована). Можете воспользоваться для теста моей функцией multi_get (простой интерфейс к PyCurl.Multi)

Совсем забыл — там же по ссылке — указание как скомпилировать pycurl+c-ares под linux/freebsd.
Спасибо, не знал

P.S. Ну после того как выложишь — сразу куча информации появится ;-) Это нормально
Просветите неандертальца, чем PyCurl лучше нативной httplib? Это относится и к данному конкретному случаю.
Мне PyCURL показался несколько более «конфигурируемым», чем httplib, хотя посмотрел ОЧЕНЬ по диагонали, так что не факт
Всем привет.

Поскольку сюда будут заходить интересующиеся, позволю себе упростить им жизнь. В свободное от работы время, я иногда пишу обертку над pycurl, которая упрощает API работы с pycurl. Стараюсь максимально приблизиться к python-request.

Думаю никто не будет спорить, что разобраться во всех принципах работы pycurl задача не очень простая, особенно в асинхронном модуле.

Библиотека human_curl доступна на гитхабе.

Вот пример использования асинхронного модуля human_curl:

from urlparse import urljoin 
from datetime import datetime

from human_curl.async import AsyncClient 
from human_curl.utils import stdout_debug

def success_callback(response, **kwargs):
    """This function call when response successed
    """
    print("success callback")
    print(response, response.request)
    print(kwargs)

def fail_callback(request, opener, **kwargs):
    """Collect errors
    """
    print("fail callback")
    print(request, opener)
    print(kwargs)

with AsyncClient(success_callback=success_callback,
                 fail_callback=fail_callback) as async_client:
    for x in xrange(10000):
        async_client.get('http://google.com/', params=(("x", str(x)),)
        async_client.get('http://google.com/', params=(("x", str(x)),),
                        success_callback=success_callback, fail_callback=fail_callback)




Обработку данных можно реализовать через систему колбэков.
Sign up to leave a comment.

Articles