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