Найти - Пользователи
Полная версия: Объясните про twisted, пожалуйста
Начало » Network » Объясните про twisted, пожалуйста
1 2
nuklea
Собственно, есть у меня вот такой класс:

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)
Хотелось бы изменить его поведение таким образом, чтобы при создании экземпляра класса Browser, метод fetch блокировал не всю программу, а только другие fetch внутри этого экземпляра (чтобы они выполнялись последовательно), а asyncFetch пускай выполняется в любое время.

Сразу признаюсь, что в twisted ничегошеньки не понимаю, документацию на английском читал, но не осилил. Помогите, люди добрые.
PooH
А он блокирует? как бы не должен
nuklea
Видимо, я неверно изложил. В общем, у меня будет вот такая картина:

1. Множество экземплятор Browser
2. Внутри каждого экземпляра очередь для fetch (то есть вызов browserN.fetch становится в очередь, которая существует ТОЛЬКО внутри экземпляра Browser)
3. Ни один вызов browserN.fetch не вызывает блокировку io глобально, а так не блокирует вызовы browserN.asyncFetch
3. asyncFetch не становится ни в какие очереди и делает все, что захочет асинхронно
Андрей Светлов
Ну так и делайте очередь внутри экземпляра Browser. Или вы на какую-то магию надеетесь?
P.S. curl+twisted - очень странная смесь. Неужно twisted.web.client оказалось недостаточно?
nuklea
Да, я надеюсь на магию, скорее всего. Наверное, рассчитывал на примеры, или чтобы тыкнули куда-нибудь :)

А web.client умеет ходить через все виды соксов и через http-прокси? А http://www.w3.org/Protocols/rfc1341/7_2_Multipart.html умеет? Просто просматривая хелп к нему, нашел две функции: downloadPage, getPage и все.
nuklea
И все-таки я соверешенно не понимаю, как подойти к созданию очереди :)
PooH
Готовое решение подойдет? http://pypi.python.org/pypi/Twisted-Goodies/0.3
bw
twisted.web.client очень слабенький, придётся многое руками делать.
С HTTP-прокси всё достаточно просто, на сколько я помню. Отправляешь запрос как есть на ip:port прокси и все дела, т.е. ничего мудрить с заголовками не нужно, вместо ip:port сайта указываешь ip:port прокси.

..bw
Андрей Светлов
bw, а вы обратили внимание на то, что этот клиент не так давно серьезно дописали?
t.w.c:Agent - пример использования, на t.w._new_client можно наваять обработку нескольких запросов в одном соединении и т.д.
bw
Я видел что его пилят, использовал последнюю версию (тот самый new) не так давно, не заметил улучшений, в основном ухудшения (timeout пропал, пришлось самому делать). Про несколько запросов (keep-alive?) не заметил, хотя смотрел внимательно.

p.s. А когда это мы на вы перешли :-) ?

p.p.s. Его даже не пилят, а делают альтернативу текущему. Вроде как из давно всеми покинутого web2 идеи берут, тут могу наврать. Из web2 я только fcgi использовал и тот несколько лет хачить приходится, есть там одно кривое место, которое не поправят (анг. не знаю, писать им не буду).

..bw
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB