Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 29, 2013 20:20:17

asdf
От:
Зарегистрирован: 2012-02-12
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Twisted ошибка в callback

Добрый день, callback функция вылетает с ошибкой, но невозможно понять где именно эта ошибка. Нет строчки типа
“ Error in file x in line y … ”. Знаю что исключение передается вверх по стеку, но пользы от этого никакой, не пойму что не так.
Код twisted

def lineReceived(self, line):
		self.lines.append(line)
		if not line:
			self.req = '\r\n'.join(self.lines)
			print self.req
			self.url = self.getUrl(self.lines[0])
			d = threads.deferToThread(self.process)  #сначала вызввается эта
			d.addCallback(self.response)		 #затем эта
	def process(self):
		print 'retrieving %s' % self.url
 		self.page = urllib2.urlopen(self.url)
		print 'success!'
  		self.data = self.page.read()
		self.hedrs = self.page.info()
		self.code = self.page.getcode()
		print 'no error'
		return 'dummy'
	def response(self, dummy):
		if self.code == 200:
			self.sendLine('HTTP/1.1 200 OK')
			self.transport.write(self.hedrs)
			self.transport.write(self.data)
			self.transport.loseConnection()
		else:
			self.sendLine('HTTP/1.1 404 Not Found')
			self.transport.write(self.hedrs)
			self.transport.write(self.data)
			self.transport.loseConnection()

Получаю вот это. Еще не ясно почему process() вызывается несколько раз(видно по нескольким линиям retrieving…).
http://pastebin.com/M5j7AxB7



Офлайн

#2 Ноя. 29, 2013 22:45:57

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

Twisted ошибка в callback

За использование urllib2 в Twisted ты попадёшь в ад.
Разберись, что у тебя возвращает `self.page.info()`.

..bw



Офлайн

#3 Ноя. 29, 2013 23:59:34

asdf
От:
Зарегистрирован: 2012-02-12
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Twisted ошибка в callback

Спасибо, проблема в этом.
А urllib совсем нельзя? Даже внутри threads?



Офлайн

#4 Ноя. 30, 2013 00:58:31

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

Twisted ошибка в callback

Нельзя по идеологическим причинам. Бывают случаи, когда избежать блокирующих вызовов либо нельзя, либо очень дорого, тогда остаётся использовать потоки или выносить такой функционал в отдельные процессы. Потоки вообще, как по мне, смотрятся в Twisted инородно, может именно как костыль для борьбы с блокирующими вызовами их и придумали, кто знает. Но для данного случая есть в Twisted клиент HTTP и я бы использовал его, а не urllib2.

Но если не нравится событийная модель, можно использовать потоковую (микронити нынче в моде), библиотек для этого дела хоть %#пой жуй: eventlet, syncless, concurrence, gevent, diesel, whizzer и т.д. Всё зависит от задачи, если она не такая грандиозная и не подразумевает использования ряда существующих сетевых протоколов (HTTP я за протокол считать не буду :-) то точно ли нужен Twisted?

..bw



Офлайн

#5 Дек. 7, 2013 21:07:11

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2260
Репутация: +  41  -
Профиль   Отправить e-mail  

Twisted ошибка в callback

в твистед ещё есть inlineCallbacks (самое ‘ок’) и deferredGenerator
вот неплохая статья http://blog.mekk.waw.pl/archives/14-Twisted-inlineCallbacks-and-deferredGenerator.html

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version