Приложение My Gae извлекает данные JSON с стороннего сайта; с учетом идентификатора, представляющего элемент для загрузки, данные элемента на этом сайте организованы на нескольких страницах, поэтому мой код должен загружать куски данных, страницы за страницей, пока не будут получены данные последней доступной страницы.
Мой упрощен код выглядит следующим образом:Google App Engine: как распараллелить загрузки с помощью TaskQueue или Async Urlfetch?
class FetchData(webapp.RequestHandler):
def get(self):
...
data_list = []
page = 1
while True:
fetched_data= urlfetch.fetch('http://www.foo.com/getdata?id=xxx&result=JSON&page=%s' % page)
data_chunk = fetched_data["data"]
data_list = data_list + data_chunk
if len(data_list) == int(fetched_data["total_pages"]):
break
else:
page = page +1
...
doRender('dataview.htm',{'data_list':data_list})
The data_list
результатов представляет собой упорядоченный список, где первый элемент имеет данные номер страницы 1 и последний элемент имеет данные последней страницы; этот data_list
, после получения, отображается в представлении.
Этот подход работает 99% времени, но иногда из-за предела 30 секунд навязанной Google App Engine, на элементы с большим количеством страниц я получаю страшился DeadlineExceededError
. Я хотел бы знать, если использовать TaskQueue | Deferred | AsyncUrlfetch Я мог бы улучшить этот алгоритм, распараллеливая в некотором роде N вызовов URL-адресов.
Позвольте мне знать, если решение ниже работает для вас –
есть вам повезло? –