Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 5, 2010 17:33:55

nuklea
От:
Зарегистрирован: 2009-12-05
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

Объясните про twisted, пожалуйста

Собственно, есть у меня вот такой класс:

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 ничегошеньки не понимаю, документацию на английском читал, но не осилил. Помогите, люди добрые.



Офлайн

#2 Апрель 6, 2010 12:44:33

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Объясните про twisted, пожалуйста

А он блокирует? как бы не должен



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#3 Апрель 6, 2010 13:52:47

nuklea
От:
Зарегистрирован: 2009-12-05
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

Объясните про twisted, пожалуйста

Видимо, я неверно изложил. В общем, у меня будет вот такая картина:

1. Множество экземплятор Browser
2. Внутри каждого экземпляра очередь для fetch (то есть вызов browserN.fetch становится в очередь, которая существует ТОЛЬКО внутри экземпляра Browser)
3. Ни один вызов browserN.fetch не вызывает блокировку io глобально, а так не блокирует вызовы browserN.asyncFetch
3. asyncFetch не становится ни в какие очереди и делает все, что захочет асинхронно



Отредактировано (Апрель 6, 2010 14:11:39)

Офлайн

#4 Апрель 6, 2010 14:21:35

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Объясните про twisted, пожалуйста

Ну так и делайте очередь внутри экземпляра Browser. Или вы на какую-то магию надеетесь?
P.S. curl+twisted - очень странная смесь. Неужно twisted.web.client оказалось недостаточно?



Офлайн

#5 Апрель 6, 2010 14:27:19

nuklea
От:
Зарегистрирован: 2009-12-05
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

Объясните про twisted, пожалуйста

Да, я надеюсь на магию, скорее всего. Наверное, рассчитывал на примеры, или чтобы тыкнули куда-нибудь :)

А web.client умеет ходить через все виды соксов и через http-прокси? А http://www.w3.org/Protocols/rfc1341/7_2_Multipart.html умеет? Просто просматривая хелп к нему, нашел две функции: downloadPage, getPage и все.



Офлайн

#6 Апрель 6, 2010 15:20:19

nuklea
От:
Зарегистрирован: 2009-12-05
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

Объясните про twisted, пожалуйста

И все-таки я соверешенно не понимаю, как подойти к созданию очереди :)



Офлайн

#7 Апрель 7, 2010 06:30:40

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Объясните про twisted, пожалуйста

Готовое решение подойдет? http://pypi.python.org/pypi/Twisted-Goodies/0.3



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#8 Апрель 8, 2010 14:33:32

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Объясните про twisted, пожалуйста

twisted.web.client очень слабенький, придётся многое руками делать.
С HTTP-прокси всё достаточно просто, на сколько я помню. Отправляешь запрос как есть на ip:port прокси и все дела, т.е. ничего мудрить с заголовками не нужно, вместо ip:port сайта указываешь ip:port прокси.

..bw



Офлайн

#9 Апрель 8, 2010 15:34:48

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Объясните про twisted, пожалуйста

bw, а вы обратили внимание на то, что этот клиент не так давно серьезно дописали?
t.w.c:Agent - пример использования, на t.w._new_client можно наваять обработку нескольких запросов в одном соединении и т.д.



Офлайн

#10 Апрель 8, 2010 15:54:17

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Объясните про twisted, пожалуйста

Я видел что его пилят, использовал последнюю версию (тот самый new) не так давно, не заметил улучшений, в основном ухудшения (timeout пропал, пришлось самому делать). Про несколько запросов (keep-alive?) не заметил, хотя смотрел внимательно.

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

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

..bw



Отредактировано (Апрель 8, 2010 15:57:03)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version