Форум сайта python.su
Собственно, есть у меня вот такой класс:
class Browser(object):
options = {
...
}
def fetch(self, url, data=None):
def setoptDict(curlObj, optDict):
for optName, optValue in optDict.iteritems():
curlObj.setopt(getattr(pycurl, optName), optValue)
buf = StringIO()
headers = StringIO()
curl = pycurl.Curl()
curl.setopt(pycurl.URL, str(url))
curl.setopt(pycurl.WRITEFUNCTION, buf.write)
curl.setopt(pycurl.HEADERFUNCTION, headers.write)
setoptDict(curl, self.options)
curl.perform()
return buf.getvalue()
def asyncFetch(self, *args, **kwargs):
return deferToThread(self.fetch, *args, **kwargs)
Офлайн
А он блокирует? как бы не должен
Офлайн
Видимо, я неверно изложил. В общем, у меня будет вот такая картина:
1. Множество экземплятор Browser
2. Внутри каждого экземпляра очередь для fetch (то есть вызов browserN.fetch становится в очередь, которая существует ТОЛЬКО внутри экземпляра Browser)
3. Ни один вызов browserN.fetch не вызывает блокировку io глобально, а так не блокирует вызовы browserN.asyncFetch
3. asyncFetch не становится ни в какие очереди и делает все, что захочет асинхронно
Отредактировано (Апрель 6, 2010 14:11:39)
Офлайн
Ну так и делайте очередь внутри экземпляра Browser. Или вы на какую-то магию надеетесь?
P.S. curl+twisted - очень странная смесь. Неужно twisted.web.client оказалось недостаточно?
Офлайн
Да, я надеюсь на магию, скорее всего. Наверное, рассчитывал на примеры, или чтобы тыкнули куда-нибудь :)
А web.client умеет ходить через все виды соксов и через http-прокси? А http://www.w3.org/Protocols/rfc1341/7_2_Multipart.html умеет? Просто просматривая хелп к нему, нашел две функции: downloadPage, getPage и все.
Офлайн
И все-таки я соверешенно не понимаю, как подойти к созданию очереди :)
Офлайн
Готовое решение подойдет? http://pypi.python.org/pypi/Twisted-Goodies/0.3
Офлайн
twisted.web.client очень слабенький, придётся многое руками делать.
С HTTP-прокси всё достаточно просто, на сколько я помню. Отправляешь запрос как есть на ip:port прокси и все дела, т.е. ничего мудрить с заголовками не нужно, вместо ip:port сайта указываешь ip:port прокси.
..bw
Офлайн
bw, а вы обратили внимание на то, что этот клиент не так давно серьезно дописали?
t.w.c:Agent - пример использования, на t.w._new_client можно наваять обработку нескольких запросов в одном соединении и т.д.
Офлайн
Я видел что его пилят, использовал последнюю версию (тот самый new) не так давно, не заметил улучшений, в основном ухудшения (timeout пропал, пришлось самому делать). Про несколько запросов (keep-alive?) не заметил, хотя смотрел внимательно.
p.s. А когда это мы на вы перешли :-) ?
p.p.s. Его даже не пилят, а делают альтернативу текущему. Вроде как из давно всеми покинутого web2 идеи берут, тут могу наврать. Из web2 я только fcgi использовал и тот несколько лет хачить приходится, есть там одно кривое место, которое не поправят (анг. не знаю, писать им не буду).
..bw
Отредактировано (Апрель 8, 2010 15:57:03)
Офлайн