Вот еще один способ упорядочить ваш код, используя однопоточную природу Twisted: поставьте в очередь все URL, которые вы хотите обработать, запустите реактор и уменьшите счетчик при завершении каждого запроса. Когда счетчик достигнет нуля, остановите реактор, который выдаст результаты:
from twisted.web.client import getPage
from twisted.internet import reactor
class Getter(object):
def __init__(self):
self._sequence = 0
self._results = []
self._errors = []
def add(self, url):
d = getPage(url)
d.addCallbacks(self._on_success, self._on_error)
d.addCallback(self._on_finish)
self._sequence += 1
def _on_finish(self, *narg):
self._sequence -= 1
if not self._sequence:
reactor.stop()
_on_success = lambda self, *res: self._results.append(res)
_on_error = lambda self, *err: self._errors.append(err)
def run(self):
reactor.run()
return self._results, self._errors
g = Getter()
for url in ('http://www.google.com', 'http://www.yahoo.com', 'idontexist'):
g.add(url)
results, errors = g.run()
print results
print errors