Форум сайта python.su
0
Добрый день, 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()
Офлайн
20
За использование urllib2 в Twisted ты попадёшь в ад.
Разберись, что у тебя возвращает `self.page.info()`.
..bw
Офлайн
0
Спасибо, проблема в этом.
А urllib совсем нельзя? Даже внутри threads?
Офлайн
20
Нельзя по идеологическим причинам. Бывают случаи, когда избежать блокирующих вызовов либо нельзя, либо очень дорого, тогда остаётся использовать потоки или выносить такой функционал в отдельные процессы. Потоки вообще, как по мне, смотрятся в Twisted инородно, может именно как костыль для борьбы с блокирующими вызовами их и придумали, кто знает. Но для данного случая есть в Twisted клиент HTTP и я бы использовал его, а не urllib2.
Но если не нравится событийная модель, можно использовать потоковую (микронити нынче в моде), библиотек для этого дела хоть %#пой жуй: eventlet, syncless, concurrence, gevent, diesel, whizzer и т.д. Всё зависит от задачи, если она не такая грандиозная и не подразумевает использования ряда существующих сетевых протоколов (HTTP я за протокол считать не буду :-) то точно ли нужен Twisted?
..bw
Офлайн
41
в твистед ещё есть inlineCallbacks (самое ‘ок’) и deferredGenerator
вот неплохая статья http://blog.mekk.waw.pl/archives/14-Twisted-inlineCallbacks-and-deferredGenerator.html
Офлайн