Найти - Пользователи
Полная версия: Twisted ошибка в callback
Начало » Network » Twisted ошибка в callback
1
asdf
Добрый день, 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
bw
За использование urllib2 в Twisted ты попадёшь в ад.
Разберись, что у тебя возвращает `self.page.info()`.

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

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

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