Я знаю, что это не удивляет мой вопрос напрямую, но id делает то, что мне просто нужно.
Я вспомнил, что xml - не единственный тип файла, который я мог бы использовать, поэтому вместо использования анализатора xml я решил использовать json. Примерно в 2,5 раза меньше по размеру. Что означает уменьшение времени загрузки. Я использовал simplejson
в качестве json libray.
Я использовал from google.appengine.api import urlfetch
, чтобы параллельно получать потоки json:
class GetEntityJSON(webapp.RequestHandler):
def post(self):
url = 'http://url.that.generates.the.feeds/'
if self.request.get('idList'):
idList = self.request.get('idList').split(',')
try:
asyncRequests = self._asyncFetch([url + id + '.json' for id in idList])
except urlfetch.DownloadError:
# Dealed with time out errors (#5) as these were very frequent
for result in asyncRequests:
if result.status_code == 200:
entityJSON = simplejson.loads(result.content)
# Filled a database entity with some json info. It goes like this:
# entity= Entity(
# name = entityJSON['name'],
# dateOfBirth = entityJSON['date_of_birth']
# ).put()
self.redirect('/')
def _asyncFetch(self, urlList):
rpcs = []
for url in urlList:
rpc = urlfetch.create_rpc(deadline = 10)
urlfetch.make_fetch_call(rpc, url)
rpcs.append(rpc)
return [rpc.get_result() for rpc in rpcs]
Я пытался получать 10 каналов одновременно, но в большинстве случаев отдельный канал вызывал ошибку DownloadError # 5 (Time out). Затем я увеличил срок до 10 секунд и начал получать 5 каналов одновременно.
Но, тем не менее, 25k фидов, получая 5 за раз, приводит к 5k звонкам. В очереди, которая может порождать 5 задач в секунду, общее время задачи должно составлять 17 минут.