Comments 19
А curl multi?
+2
Простой.
Спасибо, забыл про него — нужно будет проверить
Спасибо, забыл про него — нужно будет проверить
+1
curl multi для этого случая подходит.
но если в программе уже есть свой event loop, то использовать curl multi не получится.
но если в программе уже есть свой event loop, то использовать curl multi не получится.
0
> а максимальное — в два раза, чем у блокирующего.
Советую перечитывать статьи перед публикацией.
Советую перечитывать статьи перед публикацией.
0
Я один не понял что на графиках?
Зачем делать 100 запросов в 200 потоках?
И вообще так понял что вы сравниваете несколько последовательных запросов на PyCurl с несколькими одновременными на Twisted? Это как-то бессмысленно получается. Или PyCurl разнесли на несколько тредов?
Зачем делать 100 запросов в 200 потоках?
И вообще так понял что вы сравниваете несколько последовательных запросов на PyCurl с несколькими одновременными на Twisted? Это как-то бессмысленно получается. Или PyCurl разнесли на несколько тредов?
0
Какой смысл использовать 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)
Дело в том, что на 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)
+2
Совсем забыл — там же по ссылке — указание как скомпилировать pycurl+c-ares под linux/freebsd.
0
Спасибо, не знал
P.S. Ну после того как выложишь — сразу куча информации появится ;-) Это нормально
P.S. Ну после того как выложишь — сразу куча информации появится ;-) Это нормально
+3
Просветите неандертальца, чем PyCurl лучше нативной httplib? Это относится и к данному конкретному случаю.
0
Всем привет.
Поскольку сюда будут заходить интересующиеся, позволю себе упростить им жизнь. В свободное от работы время, я иногда пишу обертку над pycurl, которая упрощает API работы с pycurl. Стараюсь максимально приблизиться к python-request.
Думаю никто не будет спорить, что разобраться во всех принципах работы pycurl задача не очень простая, особенно в асинхронном модуле.
Библиотека human_curl доступна на гитхабе.
Вот пример использования асинхронного модуля human_curl:
Обработку данных можно реализовать через систему колбэков.
Поскольку сюда будут заходить интересующиеся, позволю себе упростить им жизнь. В свободное от работы время, я иногда пишу обертку над 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)
Обработку данных можно реализовать через систему колбэков.
+1
Sign up to leave a comment.
Сравнение нагрузки — PyCurl vs HTTPClientFactory+Deferred