asdf
Ноя. 29, 2013 20:20:17
Добрый день, 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
Ноя. 29, 2013 22:45:57
За использование urllib2 в Twisted ты попадёшь в ад.
Разберись, что у тебя возвращает `self.page.info()`.
..bw
asdf
Ноя. 29, 2013 23:59:34
Спасибо, проблема в этом.
А urllib совсем нельзя? Даже внутри threads?
bw
Ноя. 30, 2013 00:58:31
Нельзя по идеологическим причинам. Бывают случаи, когда избежать блокирующих вызовов либо нельзя, либо очень дорого, тогда остаётся использовать потоки или выносить такой функционал в отдельные процессы. Потоки вообще, как по мне, смотрятся в Twisted инородно, может именно как костыль для борьбы с блокирующими вызовами их и придумали, кто знает. Но для данного случая есть в Twisted клиент HTTP и я бы использовал его, а не urllib2.
Но если не нравится событийная модель, можно использовать потоковую (микронити нынче в моде), библиотек для этого дела хоть %#пой жуй: eventlet, syncless, concurrence, gevent, diesel, whizzer и т.д. Всё зависит от задачи, если она не такая грандиозная и не подразумевает использования ряда существующих сетевых протоколов (HTTP я за протокол считать не буду :-) то точно ли нужен Twisted?
..bw
slav0nic
Дек. 7, 2013 21:07:11
в твистед ещё есть inlineCallbacks (самое ‘ок’) и deferredGenerator
вот неплохая статья
http://blog.mekk.waw.pl/archives/14-Twisted-inlineCallbacks-and-deferredGenerator.html